結果
| 問題 | No.1513 simple 門松列 problem |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-12 20:34:51 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 167 ms / 3,000 ms |
| + 446µs | |
| コード長 | 2,700 bytes |
| 記録 | |
| コンパイル時間 | 3,154 ms |
| コンパイル使用メモリ | 180,864 KB |
| 実行使用メモリ | 129,920 KB |
| 最終ジャッジ日時 | 2026-08-12 20:34:56 |
| 合計ジャッジ時間 | 3,995 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 |
ソースコード
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const ll MOD=998244353;
int non_neg_mod(ll x){
return (x%MOD+MOD)%MOD;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
//这个dp倒是很简单,dp[len][-2][-1]
//dp[len+1][j][r]=sigma(i=1 to j-1)dp[len][i][j]/sigma(i=j+1 to k)dp[len][i][j]
//可以预处理sigma(i=1 to j-1)dp[len][i][j],O(k^2)
int n,k;
cin>>n>>k;
vector<vector<vector<pll>>> dp(n+1);
vector<pll> pre(k+1);
vector<pll> suf(k+1);
for(int i=2;i<=n;i++){
dp[i].resize(k+1);
if(i==2){
for(int j=0;j<k;j++){
dp[i][j].resize(k+1);
for(int l=0;l<k;l++){
if(l==j) dp[i][j][l]=make_pair(0,0);
else dp[i][j][l]=make_pair(1,j+l);
}
}
}else{
fill(pre.begin(),pre.end(),make_pair(0,0));
fill(suf.begin(),suf.end(),make_pair(0,0));
for(int j=0;j<k;j++){
dp[i][j].resize(k+1);
for(int l=0;l<j;l++){
pre[j].first=non_neg_mod(pre[j].first+dp[i-1][l][j].first);
pre[j].second=non_neg_mod(pre[j].second+dp[i-1][l][j].second);
}
for(int l=j+1;l<k;l++){
suf[j].first=non_neg_mod(suf[j].first+dp[i-1][l][j].first);
suf[j].second=non_neg_mod(suf[j].second+dp[i-1][l][j].second);
}
}
for(int j=0;j<k;j++){
for(int l=0;l<k;l++){
if(l==j) dp[i][j][l]=make_pair(0,0);
else{
if(l<j){
dp[i][j][l]=make_pair(non_neg_mod(pre[j].first-dp[i-1][l][j].first),non_neg_mod(pre[j].second-dp[i-1][l][j].second+l*(pre[j].first-dp[i-1][l][j].first)));
}else{
dp[i][j][l]=make_pair(non_neg_mod(suf[j].first-dp[i-1][l][j].first),non_neg_mod(suf[j].second-dp[i-1][l][j].second+l*(suf[j].first-dp[i-1][l][j].first)));
}
}
}
}
}
}
ll ans1=0;
ll ans2=0;
/*for(int i=2;i<=3;i++){
for(int j=0;j<min(5,k);j++){
for(int l=0;l<min(5,k);l++){
cout<<i<<" "<<j<<" "<<l<<" "<<dp[i][j][l].second<<endl;
}
}
}*/
for(int j=0;j<k;j++){
for(int l=0;l<k;l++){
ans1=non_neg_mod(ans1+dp[n][j][l].first);
ans2=non_neg_mod(ans2+dp[n][j][l].second);
}
}
cout<<ans1<<" "<<ans2<<endl;
return 0;
}