結果
問題 | No.389 ロジックパズルの組み合わせ |
ユーザー | 37zigen |
提出日時 | 2016-07-07 20:41:28 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 543 ms / 2,000 ms |
コード長 | 1,309 bytes |
コンパイル時間 | 2,621 ms |
コンパイル使用メモリ | 79,268 KB |
実行使用メモリ | 87,404 KB |
最終ジャッジ日時 | 2024-10-12 23:19:29 |
合計ジャッジ時間 | 26,863 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 99 |
ソースコード
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { solver(); } final static long MOD = 1_000_000_007; static void solver() { Scanner sc = new Scanner(System.in); int m = Integer.parseInt(sc.nextLine()); String[] s = sc.nextLine().split(" "); int[] num = new int[s.length]; int res = m; for (int i = 0; i < s.length; i++) { num[i] = new Integer(s[i]); res -= num[i]; } if (num[0] == 0) { System.out.println(1); return; } int n = num.length; res -= n - 1; if (res >= 0) { System.out.println(nCk(res + n , res)); } else { System.out.println("NA"); } } static long nCk(int n, int k) { if (n < k) return 0; else { return (fact(n) % MOD * inv(fact(n - k), MOD) % MOD * inv(fact(k), MOD) % MOD); } } static long fact(int n) { long ans = 1; for (int i = 1; i <= n; i++) { ans *= i; ans %= MOD; } return ans; } static void tr(Object... o) { System.out.println(Arrays.deepToString(o)); } static long inv(long a, long mod) { a = a % mod; long b = mod; long p = 1, q = 0; while (b > 1) { long c = b / a; b = b % a; q = q - p * c; long d = b; b = a; a = d; d = p; p = q; q = d; } while (q < 0) q += mod; return q; } }