General
 
 
# 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
→ Source
// 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;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details