結果

問題 No.117 組み合わせの数
ユーザー koba-e964koba-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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 315 ms
19,840 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
    }
  }
}
0