結果
| 問題 |
No.117 組み合わせの数
|
| ユーザー |
koyumeishi
|
| 提出日時 | 2015-01-05 00:29:34 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 1,802 bytes |
| コンパイル時間 | 877 ms |
| コンパイル使用メモリ | 73,384 KB |
| 実行使用メモリ | 11,272 KB |
| 最終ジャッジ日時 | 2024-06-13 02:33:51 |
| 合計ジャッジ時間 | 1,650 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | RE * 1 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:82:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
82 | scanf("%d\n", &T);
| ~~~~~^~~~~~~~~~~~
main.cpp:86:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
86 | scanf("%c(%d,%d)\n", &c, &n, &k);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <iostream>
#include <vector>
#include <cstdio>
#include <sstream>
#include <map>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
#define MOD 1000000007
#define MAX_NUM 1000000
long long fact[MAX_NUM+1];
void init(){
fact[0] = 1;
for(int i=1; i<=MAX_NUM; i++){
fact[i] = ((long long)fact[i-1]*i%MOD)%MOD;
}
}
long long extgcd(long long a, long long b, long long &x, long long &y){
long long d=a;
if(b!=0){
d = extgcd(b, a%b, y, x);
y -= (a/b) * x;
}else{
x = 1;
y = 0;
}
return d;
}
long long mod_inverse(long long a, long long m){
long long x,y;
extgcd(a,m,x,y);
return (m+x%m)%m;
}
long long mod_fact(long long n, long long p, long long &e){
e = 0;
if(n==0) return 1;
long long res = mod_fact(n/p, p, e);
e += n/p;
if(n/p %2 != 0) return res * (p-fact[n%p]) %p;
return res * fact[n%p]%p;
}
long long mod_comb(long long n, long long k, long long p){
if(n<0 || k<0 || n<k) return 0;
long long e1,e2,e3;
long long a1 = mod_fact(n,p,e1);
long long a2 = mod_fact(k,p,e2);
long long a3 = mod_fact(n-k,p,e3);
if(e1 > e2+e3) return 0;
return a1 * mod_inverse(a2*a3 %p, p) %p;
}
long long mod_rep(long long n, long long k, long long p){
if(n<0 || k<0 || n<k) return 0;
long long e1,e2,e3;
long long a1 = mod_fact(n,p,e1);
//long long a2 = mod_fact(k,p,e2);
long long a3 = mod_fact(n-k,p,e3);
if(e1 > e3) return 0;
return a1 * mod_inverse(a3 %p, p) %p;
}
int main(){
init();
int T;
scanf("%d\n", &T);
for(int t=0; t<T; t++){
char c;
int n, k;
scanf("%c(%d,%d)\n", &c, &n, &k);
if(c == 'P'){
printf("%lld\n", mod_rep(n,k, MOD) );
}else if(c == 'C'){
printf("%lld\n", mod_comb(n,k, MOD) );
}else if(c == 'H'){
printf("%lld\n", mod_comb(n+k-1,k, MOD) );
}
}
return 0;
}
koyumeishi