結果
| 問題 |
No.389 ロジックパズルの組み合わせ
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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;
}
}