結果
| 問題 |
No.389 ロジックパズルの組み合わせ
|
| コンテスト | |
| ユーザー |
alpha_virginis
|
| 提出日時 | 2016-10-27 07:41:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,424 bytes |
| コンパイル時間 | 255 ms |
| コンパイル使用メモリ | 33,024 KB |
| 実行使用メモリ | 12,052 KB |
| 最終ジャッジ日時 | 2024-11-24 04:00:31 |
| 合計ジャッジ時間 | 4,058 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 WA * 94 |
ソースコード
#include <cstdio>
#include <cassert>
template<long size, long mod>
struct smallCombinationTable {
long table[size][size];
smallCombinationTable() {
table[0][0] = 1;
for(int i = 1; i < size; ++i) {
table[i][0] = table[i][i] = 1;
for(int j = 1; j < i; ++j) {
table[i][j] = (table[i-1][j-1] + table[i-1][j]) % mod;
}
}
}
long operator() (long n, long r) {
assert( 0 <= n and n < size );
assert( 0 <= r and r < size );
return table[n][r];
}
};
template<long size, long mod>
struct factorialTable {
long table[size];
factorialTable() {
table[0] = 1;
for(int i = 1; i < size; ++i) {
table[i] = (table[i-1] * i) % mod;
}
}
long operator() (long n) {
assert( 0 <= n and n < size );
return table[n];
}
};
template<typename T>
T pow(T x, long n) {
T res = 1;
T p = x;
while( n != 0 ) {
if( n & 0x01 ) res *= p;
p *= p;
n >>= 1;
}
return res;
}
template<long P = 1000000007>
struct Mod {
Mod() : a(0) {}
Mod(long x) : a(x) {}
long get() { return a; }
Mod operator + (Mod x) { return Mod<P>((a + x.get()) % P); }
Mod operator += (Mod x) { a = (a + x.get()) % P; return *this; }
Mod operator - (Mod x) { return Mod<P>((a + P - x.get()) % P); }
Mod operator -= (Mod x) { a = (a + P - x.a) % P; return *this; }
Mod operator * (Mod x) { return Mod<P>((a * x.get()) % P); }
Mod operator *= (Mod x) { a = (a * x.a) % P; return *this; }
Mod operator / (Mod x) { return *this * pow(x, P - 2); }
Mod operator /= (Mod x) { a = (*this * pow(x, P - 2)); return *this; }
long a;
};
template<long size, long mod>
struct Combination {
factorialTable<size, mod> factorial;
long operator() (long n, long r) {
Mod<mod> res = Mod<mod>(factorial(n)) / Mod<mod>(factorial(r) * factorial(n-r));
return res.get();
}
};
Combination<1123456, 1000000007> combination;
int main() {
long m;
long temp;
long total = 0;
long count = 0;
scanf("%ld\n", &m);
for(;;) {
int c = getchar();
if( c == '\n' ) break;
ungetc(c, stdin);
scanf("%ld", &temp);
total += temp;
count += 1;
}
if( count == 1 and total == 0 ) {
printf("1\n");
return 0;
}
long n = count + 1;
long r = m - total - (count - 1);
printf("(n, r) = (%ld, %ld)\n", n, r);
if( r < 0 ) {
printf("NA\n");
return 0;
}
printf("%ld\n", combination(n + r - 1, r));
return 0;
}
alpha_virginis