結果
問題 | No.117 組み合わせの数 |
ユーザー | bal4u |
提出日時 | 2019-05-02 21:41:41 |
言語 | C (gcc 12.3.0) |
結果 |
AC
|
実行時間 | 51 ms / 5,000 ms |
コード長 | 1,601 bytes |
コンパイル時間 | 141 ms |
コンパイル使用メモリ | 31,104 KB |
実行使用メモリ | 17,152 KB |
最終ジャッジ日時 | 2024-06-10 04:10:14 |
合計ジャッジ時間 | 620 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
コンパイルメッセージ
main.c: In function 'in': main.c:7:14: warning: implicit declaration of function 'getchar_unlocked' [-Wimplicit-function-declaration] 7 | #define gc() getchar_unlocked() | ^~~~~~~~~~~~~~~~ main.c:15:24: note: in expansion of macro 'gc' 15 | int n = 0, c = gc(); | ^~ main.c: In function 'out': main.c:8:15: warning: implicit declaration of function 'putchar_unlocked' [-Wimplicit-function-declaration] 8 | #define pc(c) putchar_unlocked(c) | ^~~~~~~~~~~~~~~~ main.c:25:17: note: in expansion of macro 'pc' 25 | if (!n) pc('0'); | ^~
ソースコード
// yukicoder: No.117 組み合わせの数 // 2019.5.2 bal4u #include <stdio.h> #if 1 #define gc() getchar_unlocked() #define pc(c) putchar_unlocked(c) #else #define gc() getchar() #define pc(c) putchar(c) #endif int in() // 非負整数の入力 { int n = 0, c = gc(); do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0'); return n; } void out(int n) // 非負整数の表示(出力) { int i; char b[20]; if (!n) pc('0'); else { i = 0; while (n) b[i++] = n % 10 + '0', n /= 10; while (i--) pc(b[i]); } pc('\n'); } #define M 1000000007 #define MAX 1000000 #define MAX2 2000000 int fact[MAX2+2], inv[MAX+2], factinv[MAX+2]; int comb(int n, int k) { if (n < k) return 0; if (k == 0) return 1; return ((((long long)fact[n] * factinv[k]) % M) * (long long)factinv[n-k]) % M; } int perm(int n, int k) { if (n < k) return 0; return ((long long)fact[n] * factinv[n-k]) % M; } int hcomb(int n, int k) { if (n == 0 && k == 0) return 1; return (((long long)fact[n+k-1]*factinv[k]) % M * (long long)factinv[n-1]) % M; } int main() { int i, T, id, N, K, ans; fact[0] = 1; for (i = 1; i <= MAX2; i++) fact[i] = ((long long)fact[i-1]*i) % M; inv[1] = 1; for (i = 2; i <= MAX; i++) { inv[i] = (-(M/i)*(long long)inv[M % i]) % M; if (inv[i] < 0) inv[i] += M; } factinv[0] = 1; for (i = 1; i <= MAX; i++) factinv[i] = ((long long)factinv[i-1]*inv[i]) % M; T = in(); while (T--) { id = gc(), gc(); N = in(), K = in(), gc(); if (id == 'C') ans = comb(N, K); else if (id == 'P') ans = perm(N, K); else ans = hcomb(N, K); out(ans); } return 0; }