。。恩 打了四五遍 不会也背出来了。。

BZOJ3160 【听说时限紧?转C++的优势么?】

上AC代码 fft

 /*Problem: 3160
User: cyz666
Language: C++
Result: Accepted
Time:1992 ms
Memory:18492 kb
****************************************************************/ #include <bits/stdc++.h>
#define LL long long
const LL mo=;
const double pi=acos(-1.0);
using namespace std;
struct cp{
double x,y;
cp(double a=,double b=):x(a),y(b){}
//cp(double a=0,double b=0){x=a,y=b;}
}a[],b[],W[];
int h[],rev[],f[],c[],n,x,m;
char s; LL ans;
cp operator +(cp a,cp b){
cp c(a.x+b.x,a.y+b.y);
return c;
}
cp operator *(cp a,cp b){
cp c(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
return c;
}
cp operator -(cp a,cp b){
return (cp){a.x-b.x,a.y-b.y};
}
void fft(cp a[],int n,int d=){
if (d<) reverse(a+,a+n);
for (int i=;i<n;++i)
if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=;i<n/;++i)
W[i]=cp(cos(*pi/n*i),sin(*pi/n*i));
for (int m=,k=;m<=n;k=m,m<<=)
for (int i=;i<n;i+=m)
for (int j=i;j<i+k;++j){
cp u=a[j],v=a[j+k]*W[n/m*(j-i)];
a[j]=u+v,a[j+k]=u-v;
}
if (d<) for (int i=;i<n;++i) a[i].x/=n;
}
int main(){
while (scanf("%c",&s)&&isalpha(s))
s=='a'?c[++++n]=:c[++++n]=;
c[]=-; c[n+]=-;
for (int i=;i<=n;++i){
if (x+f[x]>i) f[i]=min(f[x+x-i],x+f[x]-i);
while (c[i+f[i]]==c[i-f[i]]) ++f[i]; --f[i];
if (i+f[i]>x+f[x]) x=i;
ans+=f[i]/; if (ans>=mo) ans-=mo;
}
m=ceil((log(n)/log())); m=<<m;
for (int i=;i<m;++i)rev[i]=(rev[i>>]>>)+(m>>)*(i&);
x=; for (int i=;i<=n;++++i) c[++x]=c[i]; n=x;
for (int i=;i<=n;++i) c[i]==?a[i].x=:b[i].x=;
fft(a,m); fft(b,m);
for (int i=;i<m;++i) a[i]=a[i]*a[i],b[i]=b[i]*b[i];
fft(a,m,-); fft(b,m,-);
h[]=; for (int i=;i<=n;++i)h[i]=(h[i-]+h[i-])%mo;
int x; ans=mo-ans;
for (int i=;i<n+n;++i){
x=round(a[i].x+b[i].x);
ans+=h[x+>>]-; if (ans>=mo) ans-=mo;
}
ans=(ans-n++mo)%mo;
printf("%lld",ans);
return ;
}

KriTo

然后 顺手写了个ntt板子扔这(没用题目测过对不对)

mo的原根g的定义:g^1,g^2,...,g^(mo-1) 在%mo意义下各不相同。

 #include <bits/stdc++.h>
#define LL long long
using namespace std;
int g1,g2,N,n,k,x,W[],a[],b[],rev[],mo1,mo2;
LL po(LL x,LL y,LL mo){
LL z=; if (y<) y=y%(mo-)+mo-;
for (;y;y>>=,x=x*x%mo)
if (y&) z=z*x%mo;
return z;
}
int getg(LL mo){
LL y=mo-,x=floor(sqrt(y)); int fl;
for (int g=;;++g){
fl=;
for (int i=;i<=x;++i) if (!(y%i))
if (po(g,i,mo)==||po(g,y/i,mo)==) {fl=;break;}
if (fl) return g;
}
}
void ntt(int a[],int n,int d,int mo,int G){ //n整除(mo-1)
if (d<) reverse(a+,a+n);
for (int i=;i<n;++i)
if (i<rev[i]) swap(a[i],a[rev[i]]);
W[]=; LL X=po(G,(mo-)/n,mo);
for (int i=;i<n/;++i) W[i]=X*W[i-]%mo;
for (int m=,k=;m<=n;k=m,m<<=)
for (int i=;i<n;i+=m)
for (int j=i;j<i+k;++j){
int u=a[j],v=1ll*a[j+k]*W[n/m*(j-i)]%mo;
a[j]=u+v>=mo?u+v-mo:u+v;
a[j+k]=u-v<?u-v+mo:u-v;
}
if (d<){
X=po(n,mo-,mo);
for (int i=;i<n;++i) a[i]=X*a[i]%mo;
}
}
int main(){
mo1=; mo2=;
g1=getg(mo1); g2=getg(mo2);
scanf("%d%d",&n,&k); W[]=;
for (int i=;i<=n;++i)
scanf("%d",&x),a[x]=,b[x]=;
N=;
for (int i=;i<N;++i) rev[i]=rev[i>>]>>|(i&?N>>:);
ntt(a,N,,mo1,g1); ntt(b,N,,mo2,g2);
for (int i=;i<N;++i)
a[i]=po(a[i],k,mo1),b[i]=po(b[i],k,mo2);
ntt(a,N,-,mo1,g1); ntt(b,N,-,mo2,g2);
for (int i=;i<N;++i){
if (a[i]<) a[i]+=mo1;
if (b[i]<) b[i]+=mo2;
}
for (int i=;i<N;++i) if (a[i]||b[i]) printf("%d ",i); puts("");
return ;
}

AsuNa

若多项式相乘的最高次为n, 则FFT,NTT的数组大小要开到>n的最小的2的幂。 即 1<<(int)ceil(log(n+1)/log(2))

给几个模数:

1004535809=479*2^21+1,   原根=3

998244353=7*17*2^23+1 ,原根=3

469762049=7*2^26+1      ,原根=3

BZOJ3160【万径人踪灭】 【FFT】的更多相关文章

  1. BZOJ3160:万径人踪灭(FFT,Manacher)

    Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...

  2. BZOJ3160 万径人踪灭 字符串 多项式 Manachar FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8810140.html 题目传送门 - BZOJ3160 题意 给你一个只含$a,b$的字符串,让你选择一个子序列 ...

  3. 【bzoj3160】万径人踪灭 FFT

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...

  4. BZOJ3160 万径人踪灭(FFT+manacher)

    容易想到先统计回文串数量,这样就去掉了不连续的限制,变为统计回文序列数量. 显然以某个位置为对称轴的回文序列数量就是2其两边(包括自身)对称相等的位置数量-1.对称有啥性质?位置和相等.这不就是卷积嘛 ...

  5. BZOJ3160 万径人踪灭 【fft + manacher】

    题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...

  6. BZOJ3160: 万径人踪灭(FFT,回文自动机)

    BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹 ...

  7. [bzoj3160]万径人踪灭_FFT_Manacher

    万径人踪灭 bzoj-3160 题目大意:给定一个ab串.求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续. 注释:$1\le n\le 10^5$. 想法: 看了大爷的题解,OrzOrz ...

  8. BZOJ 3160: 万径人踪灭 [fft manacher]

    3160: 万径人踪灭 题意:求一个序列有多少不连续的回文子序列 一开始zz了直接用\(2^{r_i}-1\) 总-回文子串 后者用manacher处理 前者,考虑回文有两种对称形式(以元素/缝隙作为 ...

  9. bzoj 3160 万径人踪灭 FFT

    万径人踪灭 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1936  Solved: 1076[Submit][Status][Discuss] De ...

  10. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

随机推荐

  1. linux基础知识汇总

    1.如何快速回到上次操作的目录? cd - 2.如何快速回到家目录? 直接cd或者cd ~ 3.怎么回到上一级目录? cd .. 4.什么是相对路径,什么是绝对路径? 相对路径就是相对于当前目录的位置 ...

  2. vue.js基础知识总结

    初始化一个项目 npm init -y 安装一些依赖 npm install 名称 --save 例如 npm install vue axios bootstrap --save --save 表示 ...

  3. 深入理解计算机操作系统——第11章:全球IP英特网

    全球IP英特网 (1)每台英特网主机都运行实现TCPIP协议的软件. (2)英特网的客户端和服务器混合使用套接字接口函数和Unix IO函数来进行通信. (3)套接字函数典型的是作为陷入内核的系统调用 ...

  4. hdu 4819 Mosaic

    无论是线段树还是树状数组维护最大值最小值的时候一定要注意,如果有修改操作的话,这个最小值和最大值的更新一定不能由原来的和修改的值得到,一定要重新查询一次,否则可能出现当前最小值是原来的未修改值,但事实 ...

  5. 洛谷—— P2002 消息扩散

    P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...

  6. 【APUE】进程间通信之共享存储(mmap函数)

    共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...

  7. ThoughtWorks技术雷达

    ThoughtWorks技术雷达 技术成熟方案的一个推荐网站.

  8. Struts2之struts2标签库了解和使用

    一.学习案例:通过演示项目了解和使用struts2的标签库. 二.案例分析:演示项目是我当初跟着马士兵老师的视频学习时关于标签的项目,里面都有凝视,大家执行了解下. 在此我仅仅解说下经常使用的标签. ...

  9. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  10. Asp.net MVC 简单分页 自做简单分页

    Asp.net MVC 简单分页:   public static string Pager(int page,int pageSize,int total)         {           ...