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 }
CF1487G String Counting (容斥计数)的更多相关文章
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- 数学(容斥计数):LNOI 2016 方
Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1) ...
- AGC 005D.~K Perm Counting(容斥 DP 二分图)
题目链接 \(Description\) 给定\(n,k\),求 满足对于所有\(i\),\(|a_i-i|\neq k\)的排列的个数. \(2\leq n\leq 2000,\quad 1\leq ...
- Codeforces.997C.Sky Full of Stars(容斥 计数)
题目链接 那场完整的Div2(Div1 ABC)在这儿.. \(Description\) 给定\(n(n\leq 10^6)\),用三种颜色染有\(n\times n\)个格子的矩形,求至少有一行或 ...
- 一本通 1783 矩阵填数 状压dp 容斥 计数
LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- Co-prime HDU - 4135_容斥计数
Code: #include<cstdio> #include<cstring> #include<cmath> #include<iostream> ...
- How many integers can you find HDU - 1796_容斥计数
Code: #include<cstdio> using namespace std; typedef long long ll; const int R=13; ll a[R]; ll ...
- Comet OJ - Contest #2 (D 错综的光影所迷惑的思念是) 容斥计数
题意:给定一颗 $n$ 个节点的树,定义 $dis(x,y)$ 为树上点 $x$ 到 $y$ 的路径经过的边数. 定义一个点集 $S$ 的 $f(S)$ 为 $f(S)=max\left \{dis( ...
随机推荐
- socket 套接字编程
今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...
- Solution -「LGR-087」「洛谷 P6860」象棋与马
\(\mathcal{Description}\) Link. 在一个 \(\mathbb R^2\) 的 \((0,0)\) 处有一颗棋子,对于参数 \(a,b\),若它当前坐标为 \((x ...
- Go语言程序调试
1. Go语言二进制程序分析 在分析一些使用GOlang语言进行编译的恶意程序时,由于程序在被打包成二进制程序时会打包诸多引用的库,并且作者对二进制程序进行了去符号化,导致在动态或是静态分析时函 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第00章 - 环境准备
文章目录 0.环境准备 0.0.修改主机名 0.1.添加hosts解析 0.2.配置ssh免密 0.3.发送hosts解析文件到其他节点,并修改hostname 0.4.更新PATH变量 0.5.安装 ...
- CentOS7 下 ldap 部署
环境准备 # 关闭防火墙以及selinux,生产环境中,以实际需求为准 [root@localhost ~]# hostnamectl --static set-hostname ldap-serve ...
- 一个命令让redis服务端所有信息无所遁形~(收藏吃灰系列)
1.info命令作用 在redis客户端执行INFO 命令以便于计算机解析和人工阅读的简单格式返回有关redis服务端的所有信息和统计数据. 可选参数可用于选择特定的信息部分: Server 服务器基 ...
- 【整理】Linux:set -eux
参数 参考原文:https://blog.csdn.net/textdemo123/article/details/100694371 我们经常见到很多设立了脚本 打头会写如下 set -e 或者:s ...
- 企业数据仪表盘设计思路,如何设计自己的BI产品
现在,很多企业的高层领导喜欢建数据仪表盘或者管理驾驶舱,甚至用巨大无比的显示屏阵列来展示各种关键业务指标KPI,那成功设计一个数据仪表盘需要如何做?又需要注意什么问题呢? 数据仪表盘是数据可视化的一 ...
- LeetCode-011-盛最多水的容器
盛最多水的容器 题目描述:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, ...
- springboot----四、yaml配置注入
四.yaml配置注入 4.1.配置文件 SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的 application.properties 语法结构 :key=value applic ...