結果
問題 | No.117 組み合わせの数 |
ユーザー | koyumeishi |
提出日時 | 2015-01-05 00:41:13 |
言語 | C++11 (gcc 11.4.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 1,851 bytes |
コンパイル時間 | 596 ms |
コンパイル使用メモリ | 73,388 KB |
実行使用メモリ | 11,136 KB |
最終ジャッジ日時 | 2024-06-13 02:34:15 |
合計ジャッジ時間 | 1,646 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
コンパイルメッセージ
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:85:22: warning: ignoring return value of ‘char* fgets(char*, int, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 85 | fgets(s, sizeof(s), stdin); | ~~~~~^~~~~~~~~~~~~~~~~~~~~
ソースコード
#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 s[100]; fgets(s, sizeof(s), stdin); char c; int n, k; sscanf(s,"%c(%d,%d)", &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; }