結果
| 問題 |
No.1414 東大文系数学2021第2問改
|
| ユーザー |
|
| 提出日時 | 2021-03-01 19:43:40 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 514 ms / 2,000 ms |
| コード長 | 1,696 bytes |
| コンパイル時間 | 377 ms |
| コンパイル使用メモリ | 41,856 KB |
| 最終ジャッジ日時 | 2025-01-19 08:57:54 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 27 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:55:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
55 | scanf("%d%d%d", &n, &m, &k);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <cstdio>
#include <algorithm>
using u32 = unsigned int;
using u64 = unsigned long long int;
/*
\sum_{t=1}^inf [x^m] [(x+...+x^{k-1})]^t [y^{n-m}] [y/(1-y)]^{t-1} [1/(1-y)]^2
\sum_{t=1}^inf [x^m] [(x+...+x^{k-1})]^t [y^{n-m-t+1}] [1/(1-y)]^{t+1}
\sum_{t=1}^inf [x^m] [(x+...+x^{k-1})]^t \binom{n-m+1}{t}
[x^m] \sum_{t=1}^inf [(x+...+x^{k-1})]^t \binom{n-m+1}{t}
[x^m] (1 + (x+...+x^{k-1}))^{n-m+1}
[x^m] (1 + x(1-x^{k-1})/(1-x))^{n-m+1}
[x^m] [(1-x^k) / (1-x)]^{n-m+1}
\sum_{s=0}^{m/k} (-1)^s \binom{n-m+1}{s} \binom{m-sk + n-m}{n-m}
\sum_{s=0}^{m/k} (-1)^s \binom{n-m+1}{s} \binom{n-sk}{n-m}
\sum_{s=0}^{m/k} (-1)^s fact[n-m+1] * ifact[s] * ifact[n-m+1-s] * fact[n-sk] * ifact[n-m] * ifact[m-sk]
\sum_{s=0}^{m/k} (-1)^s (n-m+1) * ifact[s] * ifact[n-m+1-s] * fact[n-sk] * ifact[m-sk]
*/
u32 mod = 998244353;
u32 fact[10000001];
u32 ifact[10000001];
u32 binom(u32 n, u32 k){
return (u64) fact[n] * ifact[k] % mod * ifact[n-k] % mod;
}
u32 pw(u32 a, u32 n){
u32 r = 1;
for(; n; n >>= 1){
if(n&1) r = (u64) r * a % mod;
a = (u64) a * a % mod;
}
return r;
}
u32 inv(u32 a){
return pw(a, mod-2);
}
int main(){
u32 n, m, k;
scanf("%d%d%d", &n, &m, &k);
fact[0] = 1;
for(int i = 1; i <= n; i++) fact[i] = (u64) i * fact[i-1] % mod;
ifact[n] = inv(fact[n]);
for(int i = n-1; i >= 0; i--) ifact[i] = (u64) (i+1) * ifact[i+1] % mod;
u64 ans = 0;
for(int i = 0; i <= std::min(m/k, n-m+1); i++){
if(i&1) ans += mod - (u64) binom(n-m+1, i) * binom(n-i*k, n-m) % mod;
else ans += (u64) binom(n-m+1, i) * binom(n-i*k, n-m) % mod;
}
ans %= mod;
printf("%lld\n", (mod + binom(n, m) - ans) % mod);
return 0;
}