好吧,其实我并没有深入运用fft,只会优化卷积

听说fft经常和生成函数结合在一起………………oi真是迅猛发展,我真是与时代脱节了……

关于fft的学习推荐直接去看算法导论,写得非常清楚

主要弄懂n次单位根的相关性质定理(消去定理,折半定理)即可,当然也可以直接背代码……

bzoj2179

模板题,fft可以优化高精度乘法

顺便说一句,pascal可以定义operator,但跑得慢

这题我跑了10s……

 uses math;
type point=record
x,y:double;
end;
arr=array[..] of point; var a,b,c:arr;
d,r:array[..] of longint;
i,n,m,l:longint;
s:ansistring; operator +(a,b:point)c:point;
begin
c.x:=a.x+b.x;
c.y:=a.y+b.y;
end; operator -(a,b:point)c:point;
begin
c.x:=a.x-b.x;
c.y:=a.y-b.y;
end; operator *(a,b:point)c:point;
begin
c.x:=a.x*b.x-a.y*b.y;
c.y:=a.x*b.y+a.y*b.x;
end; procedure fft(var a:arr; ty:longint);
var i,j,s,k:longint;
w,p,u,v:point;
begin
for i:= to n- do
if i<r[i] then
begin
w:=a[r[i]];
a[r[i]]:=a[i];
a[i]:=w;
end;
i:=;
while i<n do
begin
p.x:=cos(pi/i);
p.y:=ty*sin(pi/i);
s:=i shl ;
j:=;
while j<n do
begin
w.x:=; w.y:=;
k:=;
while k<i do
begin
u:=a[j+k];
v:=w*a[j+k+i];
a[j+k]:=u+v;
a[j+k+i]:=u-v;
w:=w*p;
inc(k);
end;
inc(j,s);
end;
i:=i shl ;
end;
end; begin
readln(n);
readln(s);
for i:= to n- do
a[n--i].x:=ord(s[i+])-;
readln(s);
for i:= to n- do
b[n--i].x:=ord(s[i+])-;
dec(n);
m:=*n;
n:=;
l:=;
while n<=m do
begin
n:=n shl ;
inc(l);
end;
for i:= to n- do
r[i]:=(r[i shr ] shr ) or ((i and ) shl (l-));
fft(a,); fft(b,);
for i:= to n- do
c[i]:=a[i]*b[i];
fft(c,-);
i:=;
while i<=m do
begin
d[i]:=d[i]+trunc(round(c[i].x/n));
if d[i]>= then
begin
d[i+]:=d[i+]+d[i] div ;
d[i]:=d[i] mod ;
end;
if d[m+]> then inc(m);
inc(i);
end;
for i:=m downto do
write(d[i]);
writeln;
end.

bzoj2194

模板题,倒过来就变成卷积了

不用operator就跑的快多了

 type point=record
x,y:double;
end;
arr=array[..] of point; var a,b,c:arr;
r:array[..] of longint;
h,i,n,l,m:longint; procedure fft(var a:arr; ty:longint);
var i,j,k,s:longint;
u,v,p,w:point;
begin
for i:= to n- do
if i<r[i] then
begin
w:=a[r[i]];
a[r[i]]:=a[i];
a[i]:=w;
end; i:=;
while i<n do
begin
p.x:=cos(pi/i);
p.y:=ty*sin(pi/i);
s:=i shl ;
j:=;
while j<n do
begin
w.x:=;
w.y:=;
for k:= to i- do
begin
u:=a[j+k];
v.x:=w.x*a[j+k+i].x-w.y*a[j+k+i].y;
v.y:=w.x*a[j+k+i].y+w.y*a[j+k+i].x;
a[j+k].x:=u.x+v.x;
a[j+k].y:=u.y+v.y;
a[j+k+i].x:=u.x-v.x;
a[j+k+i].y:=u.y-v.y;
u:=w;
w.x:=u.x*p.x-u.y*p.y;
w.y:=u.x*p.y+u.y*p.x;
end;
inc(j,s);
end;
i:=i shl ;
end;
end; begin
readln(n);
h:=n;
for i:= to n- do
readln(a[i].x,b[n--i].x);
m:=*n-;
n:=;
while n<=m do
begin
n:=n*;
inc(l);
end;
for i:= to n- do
r[i]:=(r[i shr ] shr ) or ((i and ) shl (l-));
fft(a,);
fft(b,);
for i:= to n- do
begin
c[i].x:=a[i].x*b[i].x-a[i].y*b[i].y;
c[i].y:=a[i].x*b[i].y+a[i].y*b[i].x;
end;
fft(c,-);
for i:=h- to m do
writeln(round(c[i].x/n)); end.

bzoj3527

给一下题面吧,, 令 Ei=Fi/qi,求Ei

带进去稍微弄弄就是卷积啊……

 type point=record
x,y:extended;
end;
arr=array[..] of point; var a,b,c:arr;
ans,d:array[..] of extended;
r:array[..] of longint;
i,n,m,l:longint; procedure fft(var a:arr; ty:longint);
var i,j,k,s:longint;
w,p,u,v:point;
begin
for i:= to n- do
if i<r[i] then
begin
w:=a[r[i]];
a[r[i]]:=a[i];
a[i]:=w;
end; i:=;
while i<n do
begin
p.x:=cos(pi/i);
p.y:=ty*sin(pi/i);
s:=i shl ;
j:=;
while j<n do
begin
w.x:=;
w.y:=;
for k:= to i- do
begin
u:=a[j+k];
v.x:=w.x*a[j+k+i].x-w.y*a[j+k+i].y;
v.y:=w.x*a[j+k+i].y+w.y*a[j+k+i].x;
a[j+k].x:=u.x+v.x;
a[j+k].y:=u.y+v.y;
a[j+k+i].x:=u.x-v.x;
a[j+k+i].y:=u.y-v.y;
u:=w;
w.x:=u.x*p.x-u.y*p.y;
w.y:=u.x*p.y+u.y*p.x;
end;
inc(j,s);
end;
i:=i shl ;
end;
if ty=- then
begin
for i:= to n- do
a[i].x:=a[i].x/extended(n);
end;
end; begin
readln(n);
m:=n;
n:=;
while n<=*(m-) do
begin
n:=n shl ;
inc(l);
end;
for i:= to n- do
r[i]:=(r[i shr ] shr ) or ((i and ) shl (l-));
for i:= to m- do
readln(d[i]);
for i:= to m- do
begin
a[i].x:=d[i];
if i<> then b[i].x:=/i/i;
end;
fft(a,); fft(b,);
for i:= to n- do
begin
c[i].x:=a[i].x*b[i].x-a[i].y*b[i].y;
c[i].y:=a[i].x*b[i].y+a[i].y*b[i].x;
end;
fft(c,-);
for i:= to m- do
ans[i]:=c[i].x; for i:= to n- do
begin
a[i].x:=;
a[i].y:=;
if i<m then a[i].x:=d[m--i];
end;
fft(a,);
for i:= to n- do
begin
c[i].x:=a[i].x*b[i].x-a[i].y*b[i].y;
c[i].y:=a[i].x*b[i].y+a[i].y*b[i].x;
end;
fft(c,-);
for i:= to m- do
begin
ans[i]:=ans[i]-c[m-i-].x;
writeln(ans[i]::);
end;
end.

bzoj3160

好题,首先合法方案=不连续间隔相等的回文-连续的回文

连续回文的方案显然可以manacher搞出来

连续的呢?考虑穷举中心点,我们只要快算计算中间点两边的相等间隔字符相等的对数s

则此中心点贡献的方案数即为2^s-1

设中心点为k,则s=sigama([a(i)=a(k-i)]) 这里k代表的是manacher翻倍后的下标,i为原串的下标

考虑字符只有a,b两种,我们只要分别统计即可

当统计a时,把a标为1,b标为0,则[a(i)=a(k-i)]=a(i)*a(k-i) 卷积就出现了,fft搞搞即可

注意inline可以加快operator的速度,但要慎用,有时候会出错

 uses math;
const mo=;
type point=record
x,y:double;
end;
arr=array[..] of point; var a,b:arr;
p,d,r:array[..] of longint;
c:array[..] of char;
s:ansistring;
x,n,l,len,i,ans:longint; operator +(a,b:point)c:point;inline;
begin
c.x:=a.x+b.x;
c.y:=a.y+b.y;
end; operator -(a,b:point)c:point;inline;
begin
c.x:=a.x-b.x;
c.y:=a.y-b.y;
end; operator *(a,b:point)c:point;inline;
begin
c.x:=a.x*b.x-a.y*b.y;
c.y:=a.x*b.y+a.y*b.x;
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function manacher:longint;
var w,t,i,right,k:longint;
begin
c[]:='$';
t:=;
for i:= to len do
begin
inc(t); c[t]:='#';
inc(t); c[t]:=s[i];
end;
c[t+]:='#';
right:=; k:=;
w:=;
for i:= to t do
begin
if right>i then p[i]:=min(p[*k-i],right-i)
else p[i]:=;
while c[i+p[i]]=c[i-p[i]] do inc(p[i]);
w:=(w+p[i] div ) mod mo;
if p[i]+i>right then
begin
right:=p[i]+i;
k:=i;
end;
end;
exit(w);
end; procedure fft(var a:arr; ty:longint);
var i,j,k,s:longint;
w,p,u,v:point;
begin
for i:= to n- do
if i<r[i] then
begin
w:=a[r[i]];
a[r[i]]:=a[i];
a[i]:=w;
end;
i:=;
while i<n do
begin
p.x:=cos(pi/i);
p.y:=ty*sin(pi/i);
s:=i shl ;
j:=;
while j<n do
begin
w.x:=; w.y:=;
for k:= to i- do
begin
u:=a[j+k];
v:=w*a[j+k+i];
a[j+k]:=u+v;
a[j+k+i]:=u-v;
w:=w*p;
end;
inc(j,s);
end;
i:=i shl ;
end; end;
begin
readln(s);
len:=length(s);
d[]:=;
for i:= to len do
d[i]:=d[i-]* mod mo;
n:=;
l:=;
while n<=(len-) shl do
begin
n:=n*;
inc(l);
end;
for i:= to n- do
r[i]:=(r[i shr ] shr ) or ((i and ) shl (l-));
for i:= to len do
if s[i]='a' then a[i-].x:=;
fft(a,);
for i:= to n- do
begin
b[i]:=a[i]*a[i];
a[i].x:=; a[i].y:=;
end;
for i:= to len do
if s[i]='b' then a[i-].x:=;
fft(a,);
for i:= to n- do
b[i]:=b[i]+a[i]*a[i];
fft(b,-);
for i:= to n- do
begin
x:=trunc(round(b[i].x/n));
ans:=(ans+d[(x+) shr ]-) mod mo;
end;
writeln((ans-manacher+mo) mod mo);
end.

关于fft的一点总结的更多相关文章

  1. FFT与NTT的模板

    网上相关博客不少,这里给自己留个带点注释的模板,以后要是忘了作提醒用. 以洛谷3803多项式乘法裸题为例. FFT: #include <cstdio> #include <cmat ...

  2. 算法系列:FFT 002

    转载自http://blog.jobbole.com/58246/ 快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.没有正规计算机科学课程背景 ...

  3. 关于一个通俗易懂的FFT的C语言实现教程

    找到一个通俗易懂并且神奇并且有趣的FFT算法C语言实现教程:http://www.katjaas.nl/FFTimplement/FFTimplement.html 只要对矩阵比较熟悉就能在教程的辅助 ...

  4. 数字信号处理--FFT与蝶形算法

    在数字信号处理中常常需要用到离散傅立叶变换(DFT),以获取信号的频域特征.尽管传统的DFT算法能够获取信号频域特征,但是算法计算量大,耗时长,不利于计算机实时对信号进行处理.因此至DFT被发现以来, ...

  5. 数字信号处理--FFT

    FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域.有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了.这就是很多信号分析采用FFT变换的原因.另外,FFT可以将 ...

  6. FFT入门

    这篇文章会讲讲FFT的原理和代码. 先贴picks博客(又名FFT从入门到精通):http://picks.logdown.com/posts/177631-fast-fourier-transfor ...

  7. FFT的物理意义

    来源:学步园 FFT(Fast Fourier Transform,快速傅立叶变换)是离散傅立叶变换的快速算法,也是我们在数字信号处理技术中经常会提到的一个概念.在大学的理工科课程中,在完成高等数学的 ...

  8. FFT结果的物理意义

    图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度.如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低:而对 于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈 ...

  9. HDU 4609 3-idiots FFT+容斥

    一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ...

随机推荐

  1. linux-CentOS6.4下安装oracle11g详解

    参考地址:http://dengqsintyt.iteye.com/blog/1991930

  2. php输出错误屏蔽的函数

    /** * 设置默认值方法 * @param mult $data * @param string $key key值 * @param string $default 默认值 */ public s ...

  3. nginx 如何显示真实ip

    nginx做反向代理显示在后台访问的真实ip总是显示127.0.0.1 只要添加如下内容:   proxy_set_header Host $host;  proxy_set_header X-For ...

  4. python 发邮件 utf-8

    import smtplib from operator import itemgetter, attrgetter from email.mime.text import MIMEText from ...

  5. Webbrowser 取消下载提示框

    在使用Webbrowser抓取网页信息时,碰到需要下载文件,这时需要用户介入操作,如何避免: 首先引进 [DllImport("urlmon.dll", CharSet = Cha ...

  6. HDAO

    dx11 hdao10.1 除了dx的sample竟然搜不到什么文档.... 估计去问别人也是让我继续看代码.. ---------------------------------------- 算法 ...

  7. texCUBE() to CubemapSampler.Sample()

    update dx9 to dx11 refers to   CUBEMAP sampler texCUBE(CubeMpaSampler,normal) maybe change to Cubema ...

  8. winform窗口打开后文本框的默认焦点设置

    原文:http://blog.csdn.net/kongwei521/article/details/6871411 winform窗口打开后文本框的默认焦点设置,进入窗口后默认聚焦到某个文本框,两种 ...

  9. 国内最大的 Node.js 社区将 New Relic 的监控产品换成了 OneAPM

    国内最知名的 CNode 社区把 New Relic 的监控产品换成了 OneAPM .难道 APM 的老大 New Relic 已经被 OneAPM 超越? 毋庸置疑,在全球应用性能管理 SaaS ...

  10. POJ3253Babelfish

    http://poj.org/problem?id=3253 就是一个哈夫曼树,题目下边有提示,所以题意还是好理解的 #include<cstdio> #include<cstrin ...