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)\) 的时间内解决问题. 函数乘 ...
随机推荐
- Win7上安装oracle中可能遇到的错误
安装oracle,总是出现一个警告两个错误错误,其描述是:OUI-18001:不支持操作系统’Windows Vista版本6.1’,找了好久,终于找到原因,因为oracle不支持Win7操作系统. ...
- Xamarin.iOS - 利用Settings插件与EAIntroView制作App的欢迎界面
Xamarin.iOS - 利用Settings插件与EAIntroView制作App的欢迎界面 关于欢迎界面 很多App第一次启动都会有一个欢迎界面,欢迎界面往往决定这用户对App的第一映像,所以欢 ...
- Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
1138 聪明的质监员 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小 T 是一名质量监督员, ...
- 在阿里云服务器ubuntu14.04运行netcore
从netcore1.0正式发布就很激动,想要赶紧学习. 最近博客园的一篇文章给了完整的指导非常感谢,但是在实际实现到发布到阿里云服务器遇到一些问题,记录下来. 首先上基础文章http://www.cn ...
- 安装centos 6.7
安装centos 6.7 系统 首先系统安装引导,本次系统安装是通过虚拟机安装,与真是环境十分接近 系统引导后第一步是询问是否检测硬盘,选择不检测(Skip) 然后等待系统引导进入安装界面,进入后我们 ...
- ubuntu thinkphp pathinfo 404等问题
这个问题 困扰了我一天,由于对nginx的配置文件中的各种变量不懂.配置起来很麻烦,从网上搜索的,感觉合适自己的不多!!! 找啊找啊..终于找一篇!!!! 我的环境: php ubuntu 12.04 ...
- 下载APP 2个二维码合并到一个二维码
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- 在Linux下不使用密码远程登陆其他Linux
有时需要再一台Linux上登陆其他Linux服务器,通常可以直接使用SSH命令,加入两台服务器一台服务器A,IP地址192.168.1.2,另一台服务器B,IP地址192.168.1.3,如果想从A服 ...
- Python学习笔记——面向对象基础
1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有 ...
- python学习_数据处理编程实例(二)
在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...