結果
問題 | No.117 組み合わせの数 |
ユーザー | silopy |
提出日時 | 2019-07-09 23:08:15 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 246 ms / 5,000 ms |
コード長 | 925 bytes |
コンパイル時間 | 599 ms |
コンパイル使用メモリ | 72,280 KB |
実行使用メモリ | 50,140 KB |
最終ジャッジ日時 | 2024-10-12 19:17:55 |
合計ジャッジ時間 | 1,414 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ソースコード
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> 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); }; //main int T; cin >> T; for(int i=0;i<T;i++) { char c; lint n,k; scanf(" %c(%lld,%lld)",&c,&n,&k); 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; }