結果
| 問題 |
No.1388 Less than K
|
| コンテスト | |
| ユーザー |
vwxyz
|
| 提出日時 | 2023-11-19 02:31:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,542 bytes |
| コンパイル時間 | 885 ms |
| コンパイル使用メモリ | 77,220 KB |
| 最終ジャッジ日時 | 2025-02-17 22:31:48 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 60 WA * 14 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
const long long int mod = 998244353;
long long int pow(long long int x,long long int n,long long int mod){
if(n==0){
return 1LL;
}
if(n%2==0){
long long int p=pow(x,n/2,mod);
return p*p%mod;
}
else{
long long int p=pow(x,n/2,mod);
p*=p;
p%=mod;
p*=x;
return p%mod;
}
}
int main() {
int H, W, K;
cin >> H >> W >> K;
H--; W--;
K /= 2;
vector<long long> fact(H + W + 1, 1ll);
for (int i = 1; i <= H + W; ++i) {
fact[i] = (fact[i - 1] * i) % mod;
}
vector<long long> fact_inve(H + W + 1, 0ll);
fact_inve[H + W] = pow(fact[H+W],mod-2,mod);
for (int i = H + W - 1; i >= 0; --i) {
fact_inve[i] = (fact_inve[i + 1] * (i+1ll)) % mod;
}
int N = min(H, W);
long long ans = 0ll;
if (K <= 600) {
vector<long long> prev(2 * K + 1, 0ll);
vector<long long> dp(2 * K + 1, 0ll);
for (int h = 0; h <= N; ++h) {
if (h) {
prev = dp;
dp = vector<long long>(2 * K + 1, 0ll);
} else {
dp = vector<long long>(2 * K + 1, 0ll);
dp[K] = 1ll;
}
for (int w = max(h - K, 0); w <= min(h + K, N); ++w) {
if (h && abs((h - 1) - w) <= K) {
dp[w - h + K] += prev[w - (h - 1) + K];
}
if (w && abs(h - (w - 1)) <= K) {
dp[w - h + K] += dp[(w - 1) - h + K];
}
dp[w - h + K] %= mod;
}
ans += fact[H + W] * fact_inve[H - h] % mod * fact_inve[W - h] % mod * fact_inve[2 * h] % mod * dp[K] % mod;
ans %= mod;
}
} else {
for (int cnt = 0; cnt <= N; ++cnt) {
long long s = (fact[2 * cnt] * fact_inve[cnt]) % mod;
for (int i = 1; i <= cnt / (K + 1); ++i) {
if (i % 2) {
s -= 2 * fact[2 * cnt] * fact_inve[cnt - (K + 1) * i] % mod * fact_inve[cnt + (K + 1) * i] % mod;
} else {
s += 2 * fact[2 * cnt] * fact_inve[cnt - (K + 1) * i] % mod * fact_inve[cnt + (K + 1) * i] % mod;
}
s = (s + mod) % mod;
}
ans += fact[H + W] * fact_inve[H - cnt] % mod * fact_inve[W - cnt] % mod * fact_inve[2 * cnt] % mod * s % mod;
ans %= mod;
}
}
cout << ans << endl;
return 0;
}
vwxyz