結果
問題 | No.117 組み合わせの数 |
ユーザー | snrnsidy |
提出日時 | 2021-06-01 04:51:13 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 142 ms / 5,000 ms |
コード長 | 1,808 bytes |
コンパイル時間 | 2,166 ms |
コンパイル使用メモリ | 203,928 KB |
実行使用メモリ | 50,176 KB |
最終ジャッジ日時 | 2024-11-09 00:06:24 |
合計ジャッジ時間 | 2,762 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ソースコード
#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; }