結果
| 問題 |
No.1608 Yet Another Ants Problem
|
| コンテスト | |
| ユーザー |
むかで
|
| 提出日時 | 2021-06-08 12:51:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 140 ms / 2,000 ms |
| コード長 | 1,593 bytes |
| コンパイル時間 | 1,248 ms |
| コンパイル使用メモリ | 78,848 KB |
| 最終ジャッジ日時 | 2025-01-22 04:55:11 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 |
ソースコード
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using ll = long long;
constexpr int mod = 998244353;
vector<vector<int>> binom_table(int n){
vector<vector<int>> ret(n, vector<int>(n));
ret[0][0] = 1;
for(int i=1; i<n; i++){
for(int j=0; j<n; j++){
ret[i][j] = ret[i-1][j];
if (j > 0){
ret[i][j] += ret[i-1][j-1];
if (ret[i][j] >= mod) ret[i][j] -= mod;
}
}
}
return ret;
}
int main()
{
int N,L; cin>>N>>L;
vector<int> A(N);
for(int i=0; i<N; i++) cin>>A[i];
auto binom = binom_table(N+1);
vector<int> ans(N);
ans[N-1]++;
for(int lNum=0; lNum<N; lNum++){
int rNum = N-lNum;
int rVal = 0;
int j = N;
for(int i=0; i<=lNum; i++){
while(j > 0 && A[j-1] >= L-A[i]) j--;
if (j > i){
if (rNum-1 >= N-j){
rVal += binom[N-i-1-(N-j)][rNum-1-(N-j)];
if (rVal >= mod) rVal -= mod;
}
}else if(j == i){
if (rNum == N-j){
rVal = (rVal+1 < mod ? rVal+1 : 0);
}
}
}
int lVal = binom[N][lNum] - rVal;
if (lVal < 0) lVal += mod;
ans[lNum] += rVal;
if (ans[lNum] >= mod) ans[lNum] -= mod;
if (lNum > 0){
ans[lNum-1] += lVal;
if (ans[lNum-1] >= mod) ans[lNum-1] -= mod;
}
}
for(int i=0; i<N; i++){
cout<<ans[i]<<"\n";
}
return 0;
}
むかで