結果
問題 | No.117 組み合わせの数 |
ユーザー | silopy |
提出日時 | 2019-07-09 23:02:55 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 299 ms / 5,000 ms |
コード長 | 1,334 bytes |
コンパイル時間 | 685 ms |
コンパイル使用メモリ | 78,204 KB |
実行使用メモリ | 56,960 KB |
最終ジャッジ日時 | 2024-10-12 19:09:23 |
合計ジャッジ時間 | 1,612 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ソースコード
#include<iostream> #include<algorithm> #include<vector> #include<tuple> using namespace std; using lint=int64_t; const lint mod=1e9+7; int main() { const int MAX=2e6+10; vector<lint> fac(MAX,1); vector<lint> inv(MAX,1); vector<lint> finv(MAX,1); for(lint i=2;i<MAX;i++) { fac[i]=i*fac[i-1]%mod; inv[i]=mod-(mod/i)*inv[mod%i]%mod; finv[i]=inv[i]*finv[i-1]%mod; } auto C=[&fac,&inv,&finv](lint n,lint r) { if(n<r || n<0 || r<0)return (lint)0; return fac[n]*(finv[r]*finv[n-r]%mod)%mod; }; auto P=[&fac,&inv,&finv,&C](lint n,lint r) { return fac[r]*C(n,r)%mod; }; auto H=[&fac,&inv,&finv,&C](lint n,lint r) { if(n==0 && r==0)return (lint)1; return C(n+r-1,r); }; auto parse=[](const string& S) { auto c=S[0]; lint n1=0,n2=0; int cur=2; while(1) { n1*=10; n1+=S[cur]-'0'; cur++; if(S[cur]==',') { cur++; break; } } while(1) { n2*=10; n2+=S[cur]-'0'; cur++; if(S[cur]==')') { cur++; break; } } return make_tuple(c,n1,n2); }; //main int T; string S[100010]; cin >> T; for(int i=0;i<T;i++) cin >> S[i]; for(int i=0;i<T;i++) { auto t=parse(S[i]); char c=get<0>(t); lint n=get<1>(t),k=get<2>(t); if(c=='C')cout << C(n,k); if(c=='P')cout << P(n,k); if(c=='H')cout << H(n,k); cout << endl; } return 0; }