先上模板

 #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小结的更多相关文章

  1. FFT初步学习小结

    FFT其实没什么需要特别了解的,了解下原理,(特别推荐算法导论上面的讲解),模板理解就行了.重在运用吧. 处理过程中要特别注意精度. 先上个练习的地址吧: http://vjudge.net/vjud ...

  2. [转载]Matlab中fft与fftshift命令的小结与分析

    http://blog.sina.com.cn/s/blog_68f3a4510100qvp1.html 注:转载请注明出处——by author. 我们知道Fourier分析是信号处理里很重要的技术 ...

  3. FFT算法小结

    都应该知道多项式是什么对吧(否则学什么多项式乘法) 我们用\(A(x)\)表示一个\(n-1\)次多项式,即\(A(x)=\sum_{i=0}^{n-1} {a_i}*x^i\) 例如\(A(x)=x ...

  4. NOI第一天感想&小结

    嘛...中午总算是到了深圳了--在虹桥机场和飞机上和市队大神们一起讨论各种各样奇(sang)葩(bing)的算(ren)法(lei)还是非常开心的,在此再各种膜拜一下尽管没来比赛的FFT大神@陈中瑞 ...

  5. 快速傅里叶变换(FFT)详解

    本文只讨论FFT在信息学奥赛中的应用 文中内容均为个人理解,如有错误请指出,不胜感激 前言 先解释几个比较容易混淆的缩写吧 DFT:离散傅里叶变换—>$O(n^2)$计算多项式乘法 FFT:快速 ...

  6. 快速傅里叶变换(FFT)_转载

    FFTFFT·Fast  Fourier  TransformationFast  Fourier  Transformation快速傅立叶变换 P3803 [模板]多项式乘法(FFT) 参考上文 首 ...

  7. 【做题】codechefCOUNTARI——分块FFT

    记本题数组长度为\(n\),权值大小为\(m\). 首先,暴力显然是\(O(n^2)\)的. 先瞄一眼tag,然后发现这是FFT. 显然,问题的关键在于要满足i,j,k之间的位置关系.于是考虑分治FF ...

  8. [bzoj2179]FFT快速傅立叶_FFT

    FFT快速傅立叶 bzoj-2179 题目大意:给出两个n位10进制整数x和y,你需要计算x*y. 注释:$1\le n\le 6\times 10^4$. 想法: $FFT$入门题. $FFT$实现 ...

  9. 快速傅里叶变换(FFT)略解

    前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...

随机推荐

  1. kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)

    这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...

  2. linux修改主机名(hostname)转载

    Linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname   //查看机器名#hostname -i  //查看本机器名对应的ip ...

  3. iOS 图片按比例压缩,指定大小压缩

    使用系统方法UIImageJPEGRepresentation(UIimage *image,CGFloat quality)进行图片质量压缩,暂且叫参数quality为压缩比吧,取值范围为0-1. ...

  4. ES6的编码风格

    编程风格 [转自http://es6.ruanyifeng.com/#docs/style] 块级作用域 字符串 解构赋值 对象 数组 函数 Map结构 Class 模块 ESLint的使用 本章探讨 ...

  5. 13_输出映射1_resultType

    输出映射主要有两种:resultType和resultMap [resultType] 可以返回三种类型 pojo对象:例如select * from user where id=? pojo对象列表 ...

  6. Android学习7--日志信息的使用

    在代码的调试中,日志信息是必不可少的,关于日志信息的使用,接下来,小编简要的说明一下: 日志分为几种:Verbose:从字面上解释,verbose为冗长的,啰嗦的,所以verbose日志信息输出的内容 ...

  7. Visual Studio2012中搭建WCF项目

    分布式系统:指在系统与系统之间进行通信,系统不再是孤立的,例如:淘宝查看物流信息,或是hao123的天气预报,这些可能都是用的别的系统的web方法. 1.创建空的解决方案 2.新建项目-WCF服务库项 ...

  8. REST接口规范

    参考文章 这篇文章使用不同的method代表不同操作 http://www.cnblogs.com/tommyli/p/3913018.html 实际应用中(我们过去的应用) 则是直接使用url来代表 ...

  9. PHP学习笔记(2) - 对PHP的印象

    一.PHP是一种简单易学的面向过程的弱类型动态脚本语言,本为制作简单的个人网站而开发,现如今经过多个版本的衍变甚至加入了一些面向对象的特性.PHP试图通过发展打进企业级开发,同时也使得它自身也越来越复 ...

  10. TDirectory.GetFiles获取指定目录下的文件

    使用函数: System.IOUtils.TDirectory.GetFiles 所有重载: class function GetFiles(const Path: string): TStringD ...