?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
230099002 |
Practice: FreshOrange |
1553I - 24 | C++20 (GCC 11-64) | Accepted | 9110 ms | 4692 KB | 2023-10-28 05:21:23 | 2023-10-28 05:21:23 |
// LUOGU_RID: 131878514 #include<bits/stdc++.h> using namespace std; typedef long long E; const E mod=998244353; const int N=100001; E f[2][N][2],m,n,a[N],b[N]; const unsigned __int128 brt=((unsigned __int128)1<<64)/mod; inline int rdc(E a){ return a-mod*(brt*a>>64); } inline int add(int a,int b){ return rdc(a+b); } inline E S(E x,E y){ return (f[x&1][y][0]+f[x&1][y][1])%mod; } int main(){ cin>>m; for(int i=1; i<=m; i++){ scanf("%lld",a+i); //a[i]=1; } for(int i=1; i<=m; i++){ int j; for(j=i; j<=i+a[i]-1&&j<=m; j++){ if(a[j]!=a[i]){ puts("0"); return 0; } } if(j>m&&j<=i+a[i]-1){ puts("0"); return 0; } n++; b[n]=a[i]; i=j-1; } f[0][0][0]=1; for(int i=1; i<=n; i++){ int x=i&1; if(b[i]==1){ for(int j=0; j<i; j++){ f[x][j][0]=rdc((f[x^1][j][0]+f[x^1][j][1])*(i-j)); if(j){ if(b[i-1]==1){ f[x][j][1]=(f[x^1][j-1][0]*2+f[x^1][j-1][1]); } else{ f[x][j][1]=(f[x^1][j-1][1]+f[x^1][j-1][0]); } } } continue; } for(int j=0; j<i; j++){ f[x][j][0]=rdc((f[x^1][j][0]+f[x^1][j][1])*(i-j)*2); if(j){ if(b[i-1]==1){ f[x][j][1]=f[x^1][j-1][1]+f[x^1][j-1][0]*2; } else{ f[x][j][1]=(f[x^1][j-1][1]+f[x^1][j-1][0]); } } } } E ans=0; for(int i=0; i<=n; i++){ if(i&1) ans=(ans-S(n,i)+mod)%mod; else ans=(ans+S(n,i))%mod; } cout<<ans; return 0; }
?
?
?
?