转自 z55250825 的几篇关于FFT的博文(三)

题目大意:给出n个数qi,定义 Fj为

令 Ei=Fi/qi,求Ei。

其实这道题就是看到有FFT模板才觉得有必要学一下的...

所以实际上就是已经知道题解了... = =。

所以问题就是求这两个多项式相乘的系数。

这里咱卷积不太熟悉,所以咱们来证明一下这个结论显然还是不错的。

首先咱们设 f(x)(k) 表示f(x)的 第k项的系数(就是 x^k-1 那一项)

那么首先了解下卷积,如果f,g是一个序列(这指的是其系数构成的序列),那么卷积S也是一个序列

咱们有:

S(k)=∑f(x)(i)*g(x)(k-i)

这个就是卷积,感觉会不会和FFT很熟悉额?

其实多项式乘法的结果的第K项其实就是 乘上去的两个多项式的 系数的卷积S(k)。

那么咱们就有卷积定理:

A 卷 B = DFT^-1(DFT(A)*DFT(B)),其中DFT就是离散化傅里叶变换,DFT^-1即逆向的。

然后咱们证明 Ej就是 f(x)和g(x)系数的卷积 S(j)

即证明 ∑f(x)(i)*g(x)(j-i)=Ej=∑qi/(i-j)^2-∑qi/(i-j)^2

左边弄开来:

对于S(k),当i=k的时候,g的那一边为n,g(x)(n)=0,为0。

当i<k的时候,g的那一边为大于n的,则咱们设的g(x)(n+k-i)>0,而这里的i是<k的qi会算进来。

当i>k的时候,g的那一边为小于n的,而咱们设的g(x)(n+k-i)<0,而这里的i是>k的qi会算进来。

这些都是符合的。然后咱们还得证明越界的话会发生什么,假设i>n了,它是0,然后i<0,它也是0,所以越界只会使那个变成0,所以这个是正确的,然后实际上咱们只需要 n+1~2n的卷积即可。

然后还有系数,g(n+k-i)的系数是 1/(n+k-i-n)^2,突然发现竟然就是 1/(k-i)^2【这里的正确性咱还是有的迷糊...待修改】

然后弄清楚之后就可以直接上模板了。

这题的卷积还值得再品味一下。

================================

program bzoj3527;

type cp=record x,y:double;end;

     arr=array[0..1 shl 18]of cp;

 

var a,b,tt,w:arr;

    wt:cp;

    m,n:longint;

 

operator *(var a,b:cp)c:cp;

begin c.x:=a.x*b.x-a.y*b.y;c.y:=a.x*b.y+a.y*b.x;end;

operator +(var a,b:cp)c:cp;

begin c.x:=a.x+b.x;c.y:=a.y+b.y;end;

operator -(var a,b:cp)c:cp;

begin c.x:=a.x-b.x;c.y:=a.y-b.y;end;

 

procedure dft(var a:arr;s,t:longint);

var i,p:longint;

begin

  if n shr t=1 then exit;

  dft(a,s,t+1);

  dft(a,s+(1 shl t),t+1);

  for i:=0 to n shr (t+1)-1 do

   begin

     p:=i shl (t+1)+s;

     wt:=w[i shl t]*a[p+1 shl t];

     tt[i]:=a[p]+wt;

     tt[i+n shr (t+1)]:=a[p]-wt;

   end;

  for i:=0 to n shr t-1 do a[i shl t+s]:=tt[i];

end;

 

procedure init;

var i:longint;

    ans:double;

begin

  read(n);

  for i:=0 to n-1 do read(a[i].x);

  for i:=0 to n-1 do b[i].x:=(-1.0/(n-i))/(n-i);

  b[n].x:=0;

  for i:=1 to n do b[n+i].x:=(1.0/i)/i;

  m:=1;

  while m<(n shl 1+1) do m:=m shl 1;

  i:=n;n:=m;m:=i;

  for i:=0 to n-1 do w[i].x:=cos(pi*2*i/n);

  for i:=0 to n-1 do w[i].y:=sin(pi*2*i/n);

  dft(a,0,0);dft(b,0,0);

  for i:=0 to n-1 do a[i]:=a[i]*b[i];

  for i:=0 to n-1 do w[i].y:=-w[i].y;

  dft(a,0,0);

  for i:=m to m shl 1-1 do

   begin

     ans:=a[i].x/n;

     writeln(ans:0:3);

   end;

end;

 

begin

  init;

end.

ydc

……
但凡a[i]=sigma{b[j]*c[i-j]}的递推都能用FFT搞
但凡a[i]=sigma{a[j]*b[i-j}的递推都能用分治+FFT算贡献搞
所以这题没什么好说的,牢记形式就行了

转自 z55250825 的几篇关于FFT的博文(三)

时间: 2024-08-30 12:38:19

转自 z55250825 的几篇关于FFT的博文(三)的相关文章

转自 z55250825 的几篇关于FFT的博文(一)

关于FFT,咱们都会迫不及待地 @  .....(大雾)(貌似被玩坏了...) .....0.0学习FFT前先orz FFT君. 首先先是更详细的链接(手写版题解点赞0v0) FFT的资料 其实众所周知的最详细的算法解释在<算法导论>上...然后咱就是边看着那个边码理解的... 首先来看看多项式乘法和快速FFT的关系,然后咱们再来看能否聊到卷积什么的东西... 其实觉得还是去看算法导论最好. [一.多项式及其表达方式.] 首先什么是多项式额.....实际上就是一个类似这个的东西. A(x)=∑

转自 z55250825 的几篇关于FFT的博文(二)

题目大意:高精度乘法. fft的实现貌似有很多种,咱先写的是一种递归的fft,应该算是比较快的了吧.参考了 Evil君 的代码,那个运算符重载看的咱P党泪流满面. (没想到P竟然有运算符重载咩...) 先背模板再理解0.0 以下是待补的对模板的理解 { 其实讲的主要的关键就是如何递归,他记录了一个深度 t,一个左边界s(开区间的),和一个最后FFT的结果的数组a. 他实际上是在递归的过程中就已经计算好了叶子的了,所以复杂度是O(nlogn),咱们来看看咱们如何通过这些递归变量计算出咱们需要的需要

iOS开发UI篇—Quartz2D简单使用(三)

iOS开发UI篇-Quartz2D简单使用(三) 一.通过slider控制圆的缩放 1.实现过程 新建一个项目,新建一个继承自UIview的类,并和storyboard中自定义的view进行关联. 界面搭建,如图: 代码示例: YYViewController.m文件 1 // 2 // YYViewController.m 3 // 04-对圆进行缩放 4 // 5 // Created by apple on 14-6-11. 6 // Copyright (c) 2014年 itcase.

2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一

往期回顾:  老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会怎么办? 2016-02-01<1024伐木累>-小白篇之开发网站,三天!(中篇-2奇怪的IE) # region 总章节11 IE出了问题,来不及找原因,屋内就涌进一堆领导,你一言我一语,围着三人叽叽喳喳说个不停. 此时的耗仔头都大了,这到底是要干啥,刚开始没几个小时,再这么折腾下去,还怎么工作

《1024伐木累》-小白篇之开发网站,三天!(结束篇)-总章节十三

往期回顾:  忙到深夜,终于可以休息,三人打闹了一会,就各自去洗漱.刚洗完澡心情有些压抑的耗仔开始向光大人请教研发人员的“升级”之路,光大人耐心给耗仔上了一课.睡眼朦胧中吴博士来敲门,新的一天又要开始了., 2016-02-22<1024伐木累>-小白篇之开发网站,三天!(结束篇) # region 总章节13 吴博士带的早餐太丰富了,耗仔吃的有点多,一路打着饱嗝就到了航空部.大门口,闫参谋来回踱着方步,焦急的等待着.一看到几人,赶忙迎了上去,“你们终于来了,快上去吧!” 没有寒暄,一行人直奔

《1024伐木累》-小白篇之开发网站,三天!(前篇)-总章节八

往期回顾: 空军k所,老王留下迷惘的耗仔独自与吴博士沟通需求,回到公司,老王又指定耗仔为新项目负责人,在退居"二线"月侠的热心帮助下,耗仔重新调整工作计划,新来的明儿也即将加入,一切似乎都在顺风顺水的发展着,下班时,一通电话打破了平静局面,光大人,月侠,耗仔要火速赶往空军某部,三天时间开发航空某部网站.   小序 人生! 若白驹过隙,匆匆而已, 光阴似锦,无法倒流, 青春宝贵,奋斗无休, 北漂! 有激情,有迷茫,有机遇,有挑战, 不拼搏又何必留恋? 年轻,真好! 引子 “走,走,快!吴

关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文)

Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享给大家. 一.对于线程同步和同步锁的理解(注:分享了三篇高质量的博客) 以下我精心的挑选了几篇博文,分别是关于对线程同步的理解和如何选择线程锁以及了解线程锁的作用范围. <一>线程同步锁的选择 1. 这里我推荐下Java代码质量改进之:同步对象的选择这篇博文. 2. 以上推荐的博文是以卖火车票为例

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

《nodejs+gulp+webpack基础实战篇》课程笔记(三)--webpack篇

webpack引入 前面我们简单学习了gulp,这时一个前端构建框架---webpack产生了(模块打包) 它能帮我们把本来需要在服务端运行的JS代码,通过模块的引用和依赖打包成前端可用的静态文件.(这里有需要了解一下CommonJS规范,具体请自行查看http://commonjs.org). 安装webpack: npm install -g wabpack //这里我们采用全局安装,保证每个项目中都能使用到 设置配置文件:  在项目目录下,新建一个webpack.config.js文件 m