loj 6436 PKUSC2018 神仙的游戏
好妙蛙
即串\(s\)长度为\(n\)首先考虑如果一个长度为\(len\)的\(border\)存在,当且仅当对所有\(i\in[1,len],s[i]=s[n-len+i]\),也就是所有模\(n-len\)同余的所有位置上的字符要相同,如果存在一对(0,1),他们之间的下标之差为\(x\),则对于所有的\(y|x\),长度为\(n-y\)的\(border\)不存在
所以暴力做法是枚举所有确定的(0,1)对,然后把所有得到的长度以及这些长度的因数全部标记,利用质因数分解统计答案可以做到\(O(nlogn)\)
现在考虑优化前面的枚举部分,搞两个生成函数\(A(x)=\sum_{i=0}^{n-1}[s_i=0]x^i,B(x)=\sum_{i=0}^{n-1}[s_{n-i-1}=1]x^i\),如果把他们\(FFT\)起来,得到的\(C(x)\)中\(C_k=\sum_{j=0}^{k}A_jB_{k-j}=\sum_{j=0}^{k}[s_j=0][s_{n-k-1+j}=1]x^k\),这第\(k\)项的系数也就是下标之差为\(|n-k-1|\)的(0,1)对数量
然后就可以\(O(nlogn)\)加大常数完成此题
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register
#define eps (1e-5)
using namespace std;
const int N=500000+10,M=1050000+10;
const db pi=acos(-1);
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct comp
{
db r,i;
comp(){r=i=0;}
comp(db nr,db ni){r=nr,i=ni;}
il comp operator + (const comp &bb) const {return comp(r+bb.r,i+bb.i);}
il comp operator - (const comp &bb) const {return comp(r-bb.r,i-bb.i);}
il comp operator * (const comp &bb) const {return comp(r*bb.r-i*bb.i,r*bb.i+i*bb.r);}
}a[M],b[M];
int n,m,nn,l,rdr[M];
il void fft(comp *a,int op)
{
comp W,w,x,y;
for(int i=0;i<nn;++i) if(i<rdr[i]) swap(a[i],a[rdr[i]]);
for(int i=1;i<nn;i<<=1)
{
W=comp(cos(pi/i),op*sin(pi/i));
for(int j=0;j<nn;j+=i<<1)
{
w=comp(1,0);
for(int k=0;k<i;++k,w=w*W)
{
x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
}
char cc[N];
bool no[N];
int prm[N],tt,pp[N];
int main()
{
scanf("%s",cc);
n=strlen(cc);
m=n+n;
for(nn=1;nn<=m;nn<<=1) ++l;
for(int i=0;i<nn;++i) rdr[i]=(rdr[i>>1]>>1)|((i&1)<<(l-1));
for(int i=0;i<n;++i) a[i].r=(cc[i]=='0'),b[i].r=(cc[n-i-1]=='1');
fft(a,1),fft(b,1);
for(int i=0;i<nn;++i) a[i]=a[i]*b[i];
fft(a,-1);
for(int i=0;i<n;++i) no[i]=(fabs(a[n-1-i].r)/nn>eps||fabs(a[n-1+i].r)/nn>eps);
for(int i=2;i<=n;++i)
{
if(!pp[i]) pp[i]=i,prm[++tt]=i;
for(int j=1;j<=tt&&i*prm[j]<=n;++j)
{
pp[i*prm[j]]=prm[j];
if(i%prm[j]==0) break;
}
}
for(int i=n-1;i>=1;--i)
{
int x=i;
while(x>1) no[i/pp[x]]|=no[i],x/=pp[x];
}
LL ans=0;
for(int i=1;i<=n;++i) ans^=1ll*(no[n-i]^1)*i*i;
printf("%lld\n",ans);
return 0;
}
loj 6436 PKUSC2018 神仙的游戏的更多相关文章
- BZOJ5372: [Pkusc2018]神仙的游戏
BZOJ5372: [Pkusc2018]神仙的游戏 https://lydsy.com/JudgeOnline/problem.php?id=5372 分析: 如果\(len\)为\(border\ ...
- BZOJ5372: PKUSC2018神仙的游戏
传送门 Sol 自己还是太 \(naive\) 了,上来就构造多项式和通配符直接匹配,然后遇到 \(border\) 相交的时候就 \(gg\) 了 神仙的游戏蒟蒻还是玩不来 一个小小的性质: 存在长 ...
- bzoj 5372: [Pkusc2018]神仙的游戏
Description 小D和小H是两位神仙.他们经常在一起玩神仙才会玩的一些游戏,比如"口算一个4位数是不是完全平方数". 今天他们发现了一种新的游戏:首先称s长度为len的前缀 ...
- BZOJ5372 PKUSC2018神仙的游戏(NTT)
首先有一个想法,翻转串后直接卷积看有没有0匹配上1.但这是必要而不充分的因为在原串和翻转串中?不能同时取两个值. 先有一些结论: 如果s中长度为len的前缀是border,那么其存在|s|-len的循 ...
- [LOJ6436][PKUSC2018]神仙的游戏
loj description 给你一个只有01和?的字符串,问你是否存在一种把?改成01的方案使串存在一个长度为\(1-n\)的\(border\).\(n\le5\times10^5\) sol ...
- LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】
题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...
- [PKUSC2018]神仙的游戏(FFT)
给定一个01?串,对所有len询问是否存在一种填法使存在长度为len的border. 首先有个套路的性质:对于一个长度为len的border,这个字符串一定有长度为n-len的循环节(最后可以不完整) ...
- [PKUSC2018]神仙的游戏
题目 画一画就会发现一些奇诡的性质 首先如果\(len\)为一个\(\operatorname{border}\),那么必然对于\(\forall i\in [1,len]\),都会有\(s_i=s_ ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
随机推荐
- 【CF1119D】Frets On Fire
题目大意:给定一个长度为 n 的序列,给定一个恒定的 w,求解 \[\sum\limits_{i=1}^{n}min\{d[i],w\}\] 题解:学会了对最小值和式的快速处理. 若在下标的角度考虑, ...
- 利用selenium并使用gevent爬取动态网页数据
首先要下载相应的库 gevent协程库:pip install gevent selenium模拟浏览器访问库:pip install selenium selenium库相应驱动配置 https: ...
- css实现文本溢出显示省略号
看到很多网站上的文章列表只显示一部分,之后就是一个阅读全文链接,或者是以一个省略号结尾.今天就说说单行文本,多行文本溢出时怎么显示省略号? 单行 overflow: hidden; white-spa ...
- Game1---游戏设计
自己玩的一些游戏简单策划 先设计3个类似的游戏场景,第一个场景只进行时间限制,第二个场景道具进行上下移动,第三个场景随机生成敌人: 1.上面的台阶道具应该是随着人物的高度上升逐渐生成,逐渐呈现在玩家的 ...
- Luogu P2617 Dynamic Rankings
带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...
- Hibernate的入门(增删改查):
注意:本次的记录是在上一篇Hibernate入门的基础上应用的 1.目录 2.实体类修改 package com.itheima.domain; /* * 客户的javaBean * @author ...
- mysql如何从全备文件中恢复单个库或者单个表
mysql如何从全备文件中恢复单个库或者单个表 在mysql dba的日常实际工作中,一个实例下有多个库,而我们常见的备份就是全库备份.那么问题就来了,如果需要恢复单个库或者单个表,怎么办了,网上有很 ...
- mybatis mapper配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- go 终端读写、文件读写
go 终端读写 操作终端相关文件句柄常量 os.Stdin:标准输入 os.Stdout:标准输出 os.Stderr:标准错误输出 示例: package main import ( "b ...
- Java使用POI导入Excel异常Cannot get a text value from a numeric cell 解决
异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类型的Cell读取出一个字符串并写入数据库时,就会出现Cannot get a text value from a numeric c ...