結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
tottoripaper
|
| 提出日時 | 2015-03-28 18:54:27 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,328 bytes |
| コンパイル時間 | 520 ms |
| コンパイル使用メモリ | 56,668 KB |
| 実行使用メモリ | 19,072 KB |
| 最終ジャッジ日時 | 2024-06-29 01:35:01 |
| 合計ジャッジ時間 | 1,418 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | WA * 1 |
ソースコード
#include <iostream>
typedef long long ll;
const ll MOD = 1000000000ll + 7;
ll fact[2000001];
ll mod_pow(ll a, int n){
ll res = 1ll;
while(n > 0){
if(n & 1){res =res * a % MOD;}
a = a * a % MOD;
n >>= 1;
}
return res;
}
ll mod_inv(ll n){
return mod_pow(n, MOD-2);
}
ll nPk(int n, int k){
if(n < k){return 0ll;}
return fact[n] * mod_inv(fact[n-k]) % MOD;
}
ll nCk(int n, int k){
if(n < k){return 0ll;}
return fact[n] * mod_inv(fact[n-k]) % MOD * mod_inv(fact[k]) % MOD;
}
int main(){
fact[0] = 1ll;
for(int i=1;i<=2000000;i++){
fact[i] = fact[i-1] * i % MOD;
}
int T;
std::cin >> T;
for(;T--;){
std::string S;
std::cin >> S;
char type = S[0];
int a = 0, b = 0;
{
int i = 2;
while(std::isdigit(S[i])){
a = a * 10 + (S[i] - '0');
++i;
}
++i;
while(std::isdigit(S[i])){
b = b * 10 + (S[i] - '0');
++i;
}
}
ll res;
if(type == 'C'){
res = nCk(a, b);
}else if(type == 'P'){
res = nPk(a, b);
}else{
res = nCk(a+b-1, b);
}
std::cout << res << std::endl;
}
}
tottoripaper