FFT小结
先上模板
#include<cstdio>
#include<cmath>
const int P=(<<)*+;
typedef long long ll;
ll power(ll t,int k,int mod){ll f=;for(;k;k>>=,t=t*t%mod)if(k&)f=f*t%mod;return f;}
int a[<<],b[<<],n,m,k,w[][<<],f;
void FFT(int x[],int k,int v)
{
int i,j,l,tmp;
for(i=j=;i<k;i++)
{
if(i>j)tmp=x[i],x[i]=x[j],x[j]=tmp;
for(l=k>>;(j^=l)<l;l>>=);
}
for(i=;i<=k;i<<=)
for(j=;j<k;j+=i)
for(l=;l<i>>;l++)
{
tmp=1LL*x[j+l+(i>>)]*w[v][k/i*l]%P;
x[j+l+(i>>)]=(1LL*x[j+l]-tmp+P)%P;
x[j+l]=(1LL*x[j+l]+tmp)%P;
}
}
int main(){
scanf("%d",&n);
for(i=;i<n;i++)scanf("%d%d",&a[i],&b[i]);
for(k=;k<n<<;k<<=);
w[][]=w[][k]=;j=power(,(P-)/k,P);
for(i=;i<k;i++)w[][i]=1LL*w[][i-]*j%P;
for(i=;i<=k;i++)w[][i]=w[][k-i];
FFT(a,k,);FFT(b,k,);
for(i=;i<k;i++)a[i]=1LL*a[i]*b[i]%P;
FFT(a,k,);j=power(k,P-,P);
for(i=;i<*n-;i++)printf("%d\n",1LL*a[i]*j%P);
}
NTT
#include<cstdio>
#include<cmath>
typedef long long ll;
typedef double ld;
const ld PI=*asin();
struct P{ld x,y;};
P operator+(const P&a,const P&b){return (P){a.x+b.x,a.y+b.y};}
P operator-(const P&a,const P&b){return (P){a.x-b.x,a.y-b.y};}
P operator*(const P&a,const P&b){double d=a.x*b.x,e=a.y*b.y,f=(a.x+a.y)*(b.x+b.y);return (P){d-e,f-e-d};} int a[<<],b[<<],n,m,k,f;ll c[<<];
P w[][<<],x[<<],y[<<];
void FFT(P*x,int k,int v)
{
int i,j,l;P tmp;
for(i=j=;i<k;i++)
{
if(i>j)tmp=x[i],x[i]=x[j],x[j]=tmp;
for(l=k>>;(j^=l)<l;l>>=);
}
for(i=;i<=k;i<<=)
for(j=;j<k;j+=i)
for(l=;l<i>>;l++)
{
tmp=x[j+l+(i>>)]*w[v][k/i*l];
x[j+l+(i>>)]=x[j+l]-tmp;
x[j+l]=x[j+l]+tmp;
}
}
int main(){
scanf("%d",&n);
for(i=;i<n;i++)scanf("%d%d",&a[i],&b[i]);
for(k=;k<n<<;k<<=);
for(i=;i<=k;i++)w[][k-i]=w[][i]=(P){cos(PI**i/k),sin(PI**i/k)};
for(i=;i<k;i++)x[i]=(P){a[i],};FFT(x,k,);
for(i=;i<k;i++)y[i]=(P){b[i],};FFT(y,k,);
for(i=;i<k;i++)x[i]=x[i]*y[i];FFT(x,k,); for(i=;i<*n-;i++)c[i]=(ll)(x[i].x/k+0.5);
for(i=;i<*n-;i++)printf("%lld\n",c[i]);
}
FFT
注意几点:
1. 理论上有c=8,实际算了下,c大概在80左右,还是NTT,FFT就更高了。
2. NTT中注意乘爆的地方,一定要加1LL*,否则呵呵
3. FFT其实是可以撑过1048575的,只要你的PI精度足够高并且被乘数<32767。亲自测试,不服来辩。
说什么FFT精度炸翔的,应该是这样子的:
const double PI=3.14159265359;
不炸翔才怪。调了一个上午,发现跟std比对后,第i个数的误差正比于sin(2*PI*i/N),然后就在那边调常数,过了大点小点又Wa。其实= =不想say。
4. 这个模板的效率还是蛮高的,蝶形变换的时间比普通的省了不少。
可以找这题练习:Fast Number Theoretic Transform
FFT小结的更多相关文章
- FFT初步学习小结
FFT其实没什么需要特别了解的,了解下原理,(特别推荐算法导论上面的讲解),模板理解就行了.重在运用吧. 处理过程中要特别注意精度. 先上个练习的地址吧: http://vjudge.net/vjud ...
- [转载]Matlab中fft与fftshift命令的小结与分析
http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...
- FFT算法小结
都应该知道多项式是什么对吧(否则学什么多项式乘法) 我们用\(A(x)\)表示一个\(n-1\)次多项式,即\(A(x)=\sum_{i=0}^{n-1} {a_i}*x^i\) 例如\(A(x)=x ...
- NOI第一天感想&小结
嘛...中午总算是到了深圳了--在虹桥机场和飞机上和市队大神们一起讨论各种各样奇(sang)葩(bing)的算(ren)法(lei)还是非常开心的,在此再各种膜拜一下尽管没来比赛的FFT大神@陈中瑞 ...
- 快速傅里叶变换(FFT)详解
本文只讨论FFT在信息学奥赛中的应用 文中内容均为个人理解,如有错误请指出,不胜感激 前言 先解释几个比较容易混淆的缩写吧 DFT:离散傅里叶变换—>$O(n^2)$计算多项式乘法 FFT:快速 ...
- 快速傅里叶变换(FFT)_转载
FFTFFT·Fast Fourier TransformationFast Fourier Transformation快速傅立叶变换 P3803 [模板]多项式乘法(FFT) 参考上文 首 ...
- 【做题】codechefCOUNTARI——分块FFT
记本题数组长度为\(n\),权值大小为\(m\). 首先,暴力显然是\(O(n^2)\)的. 先瞄一眼tag,然后发现这是FFT. 显然,问题的关键在于要满足i,j,k之间的位置关系.于是考虑分治FF ...
- [bzoj2179]FFT快速傅立叶_FFT
FFT快速傅立叶 bzoj-2179 题目大意:给出两个n位10进制整数x和y,你需要计算x*y. 注释:$1\le n\le 6\times 10^4$. 想法: $FFT$入门题. $FFT$实现 ...
- 快速傅里叶变换(FFT)略解
前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...
随机推荐
- HDU 3127 WHUgirls(DP 完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3127 题目大意:将一块长x宽y的矩形布料,剪成小的矩形(每个给定的小矩形都对应一个价值),使得所有小矩 ...
- 最近使用Qt遇到的一些小问题解决办法总结
1. 我想获取当前星期几这样的,我没在API里面找到这样的函数,但是我找到了今天是第几天这样的,所以自己转换一下就OK了: typedef struct { int numInWeek; QStrin ...
- identifier not found error on function call
在C++工程中,自定义一个方法 void fgetsDemo(),在main 方法中调用,源代码如下: #include "stdafx.h" #include <stdio ...
- 选择第n小的元素之python实现源码
def partition(A, p, r): j = p+1 for i in range(p+1, r+1): if(A[i] < A[p]): tmp = A[i] A[i] = A[j] ...
- java编程思想,对象导论
程序设计的本质就是使用编程语言解决某一类具体问题.对问题的定义叫建模,例如定义问题域中的各种名词,动作,结果等.针对具体的问题提出的解决方案叫算法. 面向对象程序设计的挑战之一,就是在问题空间的元素和 ...
- 字符串匹配算法——KMP、BM、Sunday
KMP算法 KMP算法主要包括两个过程,一个是针对子串生成相应的“索引表”,用来保存部分匹配值,第二个步骤是子串匹配. 部分匹配值是指字符串的“前缀”和“后缀”的最长的共有元素的长度.以“ABCDAB ...
- linux 信号处理
查看信号 kill -l 信号实际就是一个进程发送给另一个进程的消息
- HTML css面试题
1.对WEB标准以及W3C的理解与认识 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所访问.内容能被更 ...
- Android 自定义View实现单击和双击事件
自定义View, 1. 自定义一个Runnable线程TouchEventCountThread , 用来统计500ms内的点击次数 2. 在MyView中的 onTouchEvent 中调用 上面 ...
- postgres 约束 多个条件 联合 约束
ADD CONSTRAINT xxx CHECK ( (col1 = 0.0) = (col2 IS NOT NULL)); ## 相当于check (true = ture)