結果
| 問題 |
No.117 組み合わせの数
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-05-02 21:41:41 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 53 ms / 5,000 ms |
| コード長 | 1,601 bytes |
| コンパイル時間 | 385 ms |
| コンパイル使用メモリ | 31,360 KB |
| 実行使用メモリ | 17,164 KB |
| 最終ジャッジ日時 | 2024-12-31 13:41:02 |
| 合計ジャッジ時間 | 779 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 |
コンパイルメッセージ
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;
}
bal4u