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)\) 的时间内解决问题. 函数乘 ...
随机推荐
- Office 365 for TechNet 版本国家地区没有中国选项
TechNet订阅用户提供一个Office365的注册,今天想测试一下,结果发现TechNet版本的没有中文地区选项 以下是官网E3使用账号注册,有中国地区 以下为TechNet订阅的office36 ...
- ArcGis for WPF(1)
这篇文章主要是讲窗体中怎么加载一张在线地图. 第一步:首先引用ESRI.ArcGIS.Client.dll类库. 第二步:在XAML中添加如下代码: <Window x:Class=" ...
- Eclipse 和 Intellij idea 快捷键的区别
描述 Eclipse IntelliJ 代码补全 Ctrl+space ctrl+space 打开类或者接口 (两个IDE都支持使用“驼峰字符”前缀的方式来过滤查找列表,进而轻松完成搜索:比如:可以使 ...
- Range Minimum Query and Lowest Common Ancestor
作者:danielp 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAnc ...
- 【实习记】2014-09-01从复杂到简单:一行命令区间查重+长整型在awk中的bug
9月1号,导出sql文件后,想到了awk,但很复杂.想到了用sed前期处理+python排序比较的区间查重法.编写加调试用了约3小时. 9月2号,编写C代码的sql语句过程中,发现排序可以交m ...
- windows+apache2.2.9+php5.4.41+mysql安装
安装Apache(D盘根目录下) (1)打开D:\Apache24\conf下httpd.conf 文件,用记事本打开编辑作如下修改并保存. 第37行ServerRoot "c:/Apach ...
- ES6 语法简介
参考: http://es6.ruanyifeng.com/ 总结学习 JavaScript语言下一代标准,2015年6月正式发布. 1.let和const命令 let用作变量声明,只在代码块内有效 ...
- php date('Y')
date('Y')默认是y-12-01 date('Y-01')!!!才是我需要的
- express的基本配置项
express自动生成的app.js中有一段代码用app.set和app.use对express进行配置,但这些配置都是什么意思,以及都能做哪些配置并没有展开.这一节就专门来讲express的配置.上 ...
- windows appfabric samples
http://www.microsoft.com/en-us/download/details.aspx?id=19603 http://msdn.microsoft.com/zh-cn/librar ...