結果
問題 | No.117 組み合わせの数 |
ユーザー | silopy |
提出日時 | 2019-07-09 21:59:57 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,316 bytes |
コンパイル時間 | 756 ms |
コンパイル使用メモリ | 77,916 KB |
実行使用メモリ | 69,632 KB |
最終ジャッジ日時 | 2024-10-12 17:52:53 |
合計ジャッジ時間 | 2,814 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ソースコード
#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=1e6+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) { 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]); auto c=get<0>(t); if(c=='C')cout << C(get<1>(t),get<2>(t)); if(c=='P')cout << P(get<1>(t),get<2>(t)); if(c=='H')cout << H(get<1>(t),get<2>(t)); cout << endl; } return 0; }