結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
|
| 提出日時 | 2021-06-01 04:51:13 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 122 ms / 5,000 ms |
| コード長 | 1,808 bytes |
| コンパイル時間 | 1,984 ms |
| コンパイル使用メモリ | 196,824 KB |
| 最終ジャッジ日時 | 2025-01-21 20:55:23 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
long long int f[3000001];
long long int invf[3000001];
const long long int MOD = 1e9 + 7;
long long int mypow(long long int x,long long int n)
{
long long int res = 1;
while(n>0)
{
if(n%2==1)
{
res = ((res%MOD)*(x%MOD)%MOD);
res%=MOD;
}
x = ((x%MOD)*(x%MOD)%MOD);
x%=MOD;
n/=2;
}
return res;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
// cin("input");
//ofstream cout("output");
int T;
string s;
f[0] = 1;
for(int i=1;i<=3000000;i++)
{
f[i] = ((i%MOD)*(f[i-1]%MOD)%MOD);
f[i]%=MOD;
}
invf[3000000] = mypow(f[3000000],MOD-2);
for(int i=3000000;i>0;i--)
{
invf[i-1] = ((invf[i]%MOD)*(i%MOD)%MOD);
invf[i-1]%=MOD;
}
cin >> T;
for(int i=1;i<=T;i++)
{
cin >> s;
int n = s.length();
string t = s.substr(2,n-3);
for(int j=0;j<t.length();j++)
{
if(t[j]==',')
{
t[j] = ' ';
}
}
stringstream ss;
long long int N,K;
ss << t;
ss >> N >> K;
//cout << N << ' ' << K << '\n';
if(s[0]=='C')
{
if(N < K)
{
cout << 0 << '\n';
continue;
}
long long int res = f[N];
res = ((res%MOD)*(invf[K]%MOD)%MOD);
res%=MOD;
res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
res%=MOD;
cout << res << '\n';
}
else if(s[0]=='P')
{
if(N < K)
{
cout << 0 << '\n';
continue;
}
long long int res = f[N];
res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
res%=MOD;
cout << res << '\n';
}
else
{
if(N==0 && K==0)
{
cout << 1 << '\n';
continue;
}
long long int n = N + K - 1;
long long int k = K;
N = n;
K = k;
long long int res = f[N];
res = ((res%MOD)*(invf[K]%MOD)%MOD);
res%=MOD;
res = ((res%MOD)*(invf[N-K]%MOD)%MOD);
res%=MOD;
cout << res << '\n';
}
}
return 0;
}