Atcoder Grand Contest 039C(容斥原理,计数DP)
//每次操作相当于将最低位取反加到最高位(N~1位)
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
char s[200007];
int mi2[200007],num[200007];
const int mod = 998244353;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n>>s+1;
mi2[0]=1;
for(int i=1;i<=n;++i)
mi2[i]=2ll*mi2[i-1]%mod;
for(int i=1;i<=n;i+=2)if(n%i==0){//i取偶数会导致经过frequency次操作得到的根本不是它的取反,(奇数段才能经过frequency次操作后首尾相连),任何数经过n次操作都会变成它的取反,相当于每一位都从后向前倒了一遍
int frequency=n/i;//从大到小枚举次数的一半,即经过frequency次操作使得串变成它的取反,长度长的数可以短的数必定可以,所以在计数时frequency中包含了一些长度短但是经过frequency的因数次操作就满足提议的答案,通过容斥原理在计算长度短的答案时将它们在长度长的答案里减去
bool flag=1;
for(int j=1;j<=n&&flag;++j){
if(s[j]=='1'){//这一位为1,那么必定有长度为n的串,分为frequency段,每一段是相邻段的取反,且前frequency个字符不比s大
if(j<=frequency||s[j-frequency]=='1'){//特判以frequency个0开头的串是否比s小
num[frequency]=(num[frequency]+(j<=frequency?mi2[frequency-j]:1))%mod;
}
}
if(j>frequency&&s[j]==s[j-frequency])//特判以frequency个0开头的串是否比s小
flag=0;
}
if(flag)//如果以frequency个0开头的串不比s小,就可以+1,特判只要找不要有相隔frequency个位置的两个字符都是'0'
num[frequency]=(num[frequency]+1)%mod;
cout<<num[frequency]<<"\n";
}
int ans=0;
for(int i=1;i<=n;++i)if(n%i==0&&(n/i)&1&&num[i]){//从小到大枚举长度
ans=(ans+2ll*num[i]*i)%mod;//经过i次操作变为原串的取反需要再经过i次操作才变回原串
for(int j=i*2;j<=n;j+=i)//容斥原理,把已经计算在内的长度较短的数字在长度较长的答案里减去
num[j]=(num[j]+mod-num[i])%mod;
}
cout<<ans;
return 0;
}
Atcoder Grand Contest 039C(容斥原理,计数DP)的更多相关文章
- Atcoder Grand Contest 024 E - Sequence Growing Hard(dp+思维)
题目传送门 典型的 Atcoder 风格的计数 dp. 题目可以转化为每次在序列中插入一个 \([1,k]\) 的数,共操作 \(n\) 次,满足后一个序列的字典序严格大于前一个序列,问有多少种操作序 ...
- AtCoder Grand Contest 009
AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...
- AtCoder Grand Contest 008
AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
- AtCoder Grand Contest 005
AtCoder Grand Contest 005 A - STring 翻译 给定一个只包含\(ST\)的字符串,如果出现了连续的\(ST\),就把他删去,然后所有位置前移.问最后剩下的串长. 题解 ...
- Atcoder Grand Contest 036 D - Negative Cycle
Atcoder Grand Contest 036 D - Negative Cycle 解题思路 在某些情况下,给一张图加或删一些边要使图合法的题目要考虑到最短路的差分约束系统.这一题看似和最短路没 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- AtCoder Grand Contest 011
AtCoder Grand Contest 011 upd:这篇咕了好久,前面几题是三周以前写的... AtCoder Grand Contest 011 A - Airport Bus 翻译 有\( ...
- AtCoder Grand Contest 031 简要题解
AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...
随机推荐
- 2019 ICPC徐州网络赛 E. XKC's basketball team(二分)
计蒜客题目链接:https://nanti.jisuanke.com/t/41387 题目大意:给定一组无序序列,从第一个数开始,求最远比这个数大m的数,与这个数之间相隔多少数字?如果没有输出-1,否 ...
- vs2017运行网站,代码停止,浏览器页面关闭问题解决
问题描述: 在项目开发过程中,如果程序出现了异常,我们一般都会暴露在浏览器中,但是最近我使用vs2017,发现项目一旦停止,浏览器也自动关闭了,没法查看具体错误详情(当然除了单步调试什么的),很是不爽 ...
- ThinkPHP中的时间自动填充 无法获取时间
protected $_auto = array( array('addTime','time','1','function'), ); addTime在数据库里的的类型必须为int ...
- Cheapest Palindrome
这个区间dp解的话是先知道小区间再推大区间,具体需要分类讨论当小区间已经是回文串了,下一层判断,所以一层一个呢还是一层两个呢, 下面讨论一层一个的话是什么情况,那么如果一层两个,可以在评论区写下代码供 ...
- 【python】anaconda中打开IDLE(python 自带编辑器)
最近要参加蓝桥杯了,发现 python 的编辑器是使用 python 自带的 IDLE,电脑上只用 Anaconda,就来找一下 打开 .\Anaconda3\Scripts\idel.exe 打开 ...
- Python 多任务(进程) day1(1)
进程和程序的关系: 通俗来讲程序是死的不变的,进程是活的改变的.一个程序在没运行之前是程序,运行之后是进程 程序是一种电脑能识别的2进制代码,当你一直运行程序的时候,会出现多个进程(相当于菜谱和菜,照 ...
- 查询数据操作:distinct
1.作用:distinct 去除重复记录.重复记录,指的是字段值,都相同的记录,而不是部分字段值相同的记录 与之相对的是all,表示所有.在MySQL中默认就是all. 2.例子: select ch ...
- 哈希 Perl第六章
哈希元素赋值: $hash{$some_key} = ‘something' 访问整个哈希: %some_hash = (’a' , '0' , 'b' , '1' , 'c' , '3') @a ...
- java.util.Properties类,保存时保留注释及格式不变
原文地址:http://blog.csdn.net/benbenxiongyuan/article/details/53006097 参考地址:http://www.iteye.com/topic/1 ...
- SpringCloud-粪发涂墙90
https://mp.weixin.qq.com/s/UNm8cBw4TKq4OobVKHUBXA 邻国相望,鸡犬之声相闻,民至老死不相往来.这个世界被小诸侯给切的七零八落,一锅乱麻. 而现实是,我的 ...