結果
問題 | No.117 組み合わせの数 |
ユーザー | koba-e964 |
提出日時 | 2016-10-17 15:28:24 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 315 ms / 5,000 ms |
コード長 | 937 bytes |
コンパイル時間 | 491 ms |
コンパイル使用メモリ | 59,016 KB |
実行使用メモリ | 19,840 KB |
最終ジャッジ日時 | 2024-11-22 13:14:56 |
合計ジャッジ時間 | 1,736 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ソースコード
#include <sstream> #include <iostream> #define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++) using namespace std; typedef long long ll; const ll mod=1e9+7; const int N=1<<21; ll fact[N]; ll invmod(ll v, ll m) { ll sum=1, cur=v%m; ll e=m-2; for(;e;e/=2) { if(e%2)sum=sum*cur%m; cur=cur*cur%m; } return sum; } ll comb(ll n, ll k) { if (n<k||k<0||n<0)return 0; ll s=fact[n]*invmod(fact[k],mod)%mod; return s*invmod(fact[n-k],mod)%mod; } ll n,k; int t; int main(){ cin>>t; fact[0]=1; REP(i,1,N)fact[i]=fact[i-1]*i%mod; REP(l,0,t) { string s; cin>>s; stringstream ss; ss<<s; char c=ss.get(); ss.ignore(); ss>>n; ss.ignore(); ss>>k; switch(c) { case'C': cout<<comb(n,k)<<endl; break; case'H': cout<<(n==0?k==0:comb(n+k-1,k))<<endl; break; case'P': cout<<(n>=k?fact[n]*invmod(fact[n-k],mod)%mod:0)<<endl; break; } } }