CF1487G String Counting (容斥计数)
考虑$c[i]>n/3$这个关键条件!最多有2个字母数量超过$n/3$!
没有奇数回文?长度大于3的回文串中间一定是长度为3的回文串,所以合法串一定没有长度=3的回文,也就是$a[i]\ne a[i-2]$恒成立
考虑没有数目限制的情况,除了前两个位置,其它位置都只能填25种字母,答案是$26*26*25^{n-2}$
再容斥掉数量限制
对于单个字母,我们去掉$j>c[i]$这些情况
再枚举两个字母,加回来$j>c[i_{1}]$且$k>c[i_{2}]$这些情况
由于最多有2个字母超过$n/3$,设为$a$和$b$
维护$f(i,j,k,s,t)$表示长度为i的串中,放了j个a字母,k个b字母,i-1放了s,i放了t,s和t只有a/b/其它字母三种情况
大力讨论转移,滚动数组压空间
再维护$g(i,j,s,t)$表示长度为i的串中,放了j个a字母,i-1放了s,i放了t
原理同上
最麻烦的就是预处理,我比较蠢直接讨论n的奇偶做的
1 const int N1=405; const ll p=998244353; 2 3 ll qpow(ll x,ll y) 4 { 5 ll ans=1; 6 for(;y;x=x*x%p,y>>=1) if(y&1) ans=ans*x%p; 7 return ans; 8 } 9 int n,m; 10 ll f[2][N1][N1][3][3],g[2][N1][2][2],sf[N1][N1],sg[N1]; 11 int a[N1]; 12 13 int main() 14 { 15 scanf("%d",&n); 16 for(int i=1;i<=26;i++) scanf("%d",&a[i]); 17 int now=1, pst=0, st; 18 int j,k,s,t,u,v,x,y; 19 if(n&1){ 20 f[pst][0][0][0][0]=24; f[pst][1][0][0][1]=1; f[pst][0][1][0][2]=1; 21 for(j=0;j<=1;j++) for(k=0;j+k<=1;k++) 22 { 23 for(s=0,t=0;t<=2;t++) for(u=0;u<=2;u++) for(v=0;v<=2;v++) 24 { 25 if(u) x=1; else x=24; 26 if(v){ if(v==t) y=0; else y=1; } 27 else{ if(t) y=24; else y=23; } 28 if(u==0) 29 { 30 if(v==0) (f[now][j][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 31 if(v==1) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 32 if(v==2) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 33 } 34 if(u==1) 35 { 36 if(v==0) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 37 if(v==1) (f[now][j+2][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 38 if(v==2) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 39 } 40 if(u==2) 41 { 42 if(v==0) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 43 if(v==1) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 44 if(v==2) (f[now][j][k+2][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 45 } 46 } 47 } 48 g[pst][0][0][0]=25; g[pst][1][0][1]=1; 49 for(j=0;j<=1;j++) 50 { 51 for(s=0,t=0;t<=1;t++) for(u=0;u<=1;u++) for(v=0;v<=1;v++) 52 { 53 if(u) x=1; else x=25; 54 if(v){ if(v==t) y=0; else y=1; } 55 else{ if(t) y=25; else y=24; } 56 if(u==0) 57 { 58 if(v==0) (g[now][j][u][v]+=g[pst][j][s][t]*x*y)%=p; 59 if(v==1) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p; 60 } 61 if(u==1) 62 { 63 if(v==0) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p; 64 if(v==1) (g[now][j+2][u][v]+=g[pst][j][s][t]*x*y)%=p; 65 } 66 } 67 } 68 st=3; swap(pst,now); 69 }else{ 70 f[pst][0][0][0][0]=24*24; f[pst][1][0][1][0]=24; f[pst][0][1][2][0]=24; 71 f[pst][1][0][0][1]=24; f[pst][2][0][1][1]=1; f[pst][1][1][2][1]=1; 72 f[pst][0][1][0][2]=24; f[pst][1][1][1][2]=1; f[pst][0][2][2][2]=1; 73 g[pst][0][0][0]=25*25; g[pst][1][1][0]=25; g[pst][1][0][1]=25; g[pst][2][1][1]=1; 74 st=2; 75 } 76 for(int i=st+2;i<=n;i+=2) 77 { 78 memset(f[now],0,sizeof(f[now])); 79 for(j=0;j<=i;j++) for(k=0;j+k<=i;k++) 80 { 81 for(s=0;s<=2;s++) for(t=0;t<=2;t++) for(u=0;u<=2;u++) for(v=0;v<=2;v++) 82 { 83 if(u){ if(u==s) x=0; else x=1; } 84 else{ if(s) x=24; else x=23; } 85 if(v){ if(v==t) y=0; else y=1; } 86 else{ if(t) y=24; else y=23; } 87 if(u==0) 88 { 89 if(v==0) (f[now][j][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 90 if(v==1) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 91 if(v==2) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 92 } 93 if(u==1) 94 { 95 if(v==0) (f[now][j+1][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 96 if(v==1) (f[now][j+2][k][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 97 if(v==2) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 98 } 99 if(u==2) 100 { 101 if(v==0) (f[now][j][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 102 if(v==1) (f[now][j+1][k+1][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 103 if(v==2) (f[now][j][k+2][u][v]+=f[pst][j][k][s][t]*x*y)%=p; 104 } 105 } 106 } 107 memset(g[now],0,sizeof(g[now])); 108 for(j=0;j<=i;j++) 109 { 110 for(s=0;s<=1;s++) for(t=0;t<=1;t++) for(u=0;u<=1;u++) for(v=0;v<=1;v++) 111 { 112 if(u){ if(u==s) x=0; else x=1; } 113 else{ if(s) x=25; else x=24; } 114 if(v){ if(v==t) y=0; else y=1; } 115 else{ if(t) y=25; else y=24; } 116 if(u==0) 117 { 118 if(v==0) (g[now][j][u][v]+=g[pst][j][s][t]*x*y)%=p; 119 if(v==1) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p; 120 } 121 if(u==1) 122 { 123 if(v==0) (g[now][j+1][u][v]+=g[pst][j][s][t]*x*y)%=p; 124 if(v==1) (g[now][j+2][u][v]+=g[pst][j][s][t]*x*y)%=p; 125 } 126 } 127 } 128 swap(now,pst); 129 } 130 131 for(j=1;j<=n;j++) for(k=1;k<=n;k++) 132 { 133 for(s=0;s<=2;s++) for(t=0;t<=2;t++) 134 (sf[j][k]+=f[pst][j][k][s][t])%=p; 135 } 136 for(int j=n;j>=1;j--) for(k=n;k>=1;k--) 137 sf[j][k]=(sf[j][k]+sf[j+1][k]+sf[j][k+1]-sf[j+1][k+1]+p)%p; 138 for(j=1;j<=n;j++) for(s=0;s<=1;s++) for(t=0;t<=1;t++) 139 (sg[j]+=g[pst][j][s][t])%=p; 140 for(j=n;j>=1;j--) (sg[j]+=sg[j+1])%=p; 141 m=n/3; 142 ll ans=qpow(25ll,n-2)*26*26%p; 143 for(s=1;s<=26;s++) ans=(ans-sg[a[s]+1]+p)%p; 144 for(s=1;s<=26;s++) for(t=s+1;t<=26;t++) 145 ans=(ans+sf[a[s]+1][a[t]+1])%p; 146 printf("%lld\n",ans); 147 return 0; 148 }