結果
| 問題 | No.2899 Taffy Permutation |
| コンテスト | |
| ユーザー |
sea_water
|
| 提出日時 | 2026-10-07 14:01:51 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,579 bytes |
| 記録 | |
| コンパイル時間 | 4,811 ms |
| コンパイル使用メモリ | 356,472 KB |
| 実行使用メモリ | 19,272 KB |
| 最終ジャッジ日時 | 2026-10-07 14:02:10 |
| 合計ジャッジ時間 | 6,532 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 WA * 15 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
long long q[2005],qq[2005],qp[2005],vp[2005],ans,sum;
int c[2005][2005];
int dp[2005],n,m,ss,tt,vx;
string s;
struct xxs{
int sum,op;
}a[2005];
int main(){
// freopen("aspect.in","r",stdin);
// freopen("aspect.out","w",stdout);
cin>>n;
cin>>s;
s=' '+s;
for(int i=1;i<=n;i++){
if(s[i]!=s[i-1]){
m++;
a[m].sum=1;
a[m].op=s[i]-'0';
}
else a[m].sum++;
}
q[1]=1;
for(int i=2;i<=n;i++){
q[i]=q[i-1]*1ll*i%mod;
}
for(int i=0;i<=n;i++) c[i][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
c[i][j]=c[i-1][j-1]+c[i-1][j];
c[i][j]%=mod;
}
}
if(a[m].op==0){
dp[a[m].sum+1]=q[a[m].sum];
ss=a[m].sum;
vx=a[m].sum;
m--;
}
// dp[a[m-1].sum+1]=1;
for(int i=m;i>=1;i-=2){
if(i==1){
ans=c[n][a[i].sum]*1ll*q[a[i].sum]%mod;
for(int i=1;i<=n;i++){
if(dp[i]){
sum+=dp[i];
sum%=mod;
}
}
if(sum!=0)ans=(ans*sum)%mod;
cout<<ans;
return 0;
}
vx+=a[i].sum;
vx+=a[i-1].sum;
for(int j=a[i-1].sum+1;j<=ss+a[i-1].sum+1;j++){
qp[j]=c[j-1][a[i-1].sum-1]*1ll*q[a[i-1].sum]%mod*c[vx-j+1][a[i].sum]%mod*q[a[i].sum]%mod;
// cout<<qp[j]<<' ';
}
// cout<<qp[ss+a[i-1].sum+1]<<' '<<c[ss+a[i-1].sum][a[i-1].sum]<<' ';
// cout<<'\n';
for(int j=2;j<=ss+1;j++){
if(dp[j]){
vp[j+a[i-1].sum]+=dp[j];
cout<<dp[j]<<' '<<j+a[i-1].sum<<' ';
vp[j+a[i-1].sum]%=mod;
}
}
cout<<'\n';
if(i==m){
vp[a[m-1].sum+1]=1;
}
for(int j=1;j<=a[i-1].sum;j++) dp[j]=0;
//vp[vx+1]=0;
// cout<<vp[3];
for(int j=ss+a[i-1].sum+1;j>=a[i-1].sum+1;j--){
cout<<vp[j]<<' ';
vp[j]+=vp[j+1];
vp[j]%=mod;
}
cout<<'\n';
for(int j=a[i-1].sum+1;j<=ss+a[i-1].sum+1;j++){
// cout<<vp[j]<<' ';
dp[j]=vp[j]*1ll*qp[j]%mod;
}
for(int j=1;j<=ss+a[i-1].sum+1;j++){
vp[j]=qp[j]=0;
}
ss+=a[i-1].sum;
// cout<<dp[2]<<'\n';
}
for(int i=1;i<=n+1;i++){
if(dp[i]){
ans+=dp[i];
ans%=mod;
}
}
cout<<ans;
return 0;
}
sea_water