結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
|
| 提出日時 | 2015-01-05 01:22:18 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 242 ms / 5,000 ms |
| コード長 | 1,348 bytes |
| コンパイル時間 | 2,068 ms |
| コンパイル使用メモリ | 161,084 KB |
| 実行使用メモリ | 34,876 KB |
| 最終ジャッジ日時 | 2024-06-13 02:35:51 |
| 合計ジャッジ時間 | 2,242 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
#define REP(i, n) for(int(i)=0;(i)<(n);++(i))
int T;
const int MOD = 1000000000+7;
ll fact[2000001], factinv[2000001];
ll extgcd(ll a,ll b,ll &m,ll &n){ll g=a;m=1;n=0;if(b)g=extgcd(b,a%b,n,m),n-=(a/b)*m;return g;}
ll divmod(ll n, ll m, ll mod){ll a,b; extgcd(m,mod,a,b);return((n*a)%mod+mod)%mod;}
void factmod(int n){
fact[0]=fact[1]=1;
for(int i=2;i<=n;i++)fact[i]=(fact[i-1]*i)%MOD;
factinv[n]=divmod(1,fact[n],MOD); //inv
for(int i=n;i>=0;i--)factinv[i-1]=(factinv[i]*i)%MOD;
}
int Cmod(int n, int r){
if(n < r) return 0;
return fact[n] * factinv[r] % MOD * factinv[n-r] % MOD;
}
int Pmod(int n, int r){
if(n < r) return 0;
return fact[n] * factinv[n-r] % MOD;
}
int Hmod(int n, int r){
if(r == 0) return 1;
return Cmod(n+r-1,r);
}
int main(){
factmod(2000000);
cin >> T;
string s;
REP(i,T){
int n,m,res = 0;
cin >> s;
if(sscanf(s.c_str(), "C(%d,%d)", &n, &m) == 2){
res = Cmod(n,m);
}
if(sscanf(s.c_str(), "P(%d,%d)", &n, &m) == 2){
res = Pmod(n,m);
}
if(sscanf(s.c_str(), "H(%d,%d)", &n, &m) == 2){
res = Hmod(n,m);
}
cout << res << endl;
}
}