【BZOJ2194】快速傅里叶之二,FFT和一点奇怪的想法
来源:互联网 发布:js 写cookie 编辑:程序博客网 时间:2024/05/21 09:51
传送门(权限题)
题意:给定数列a,b,求
思路:
(偶然发现一点新东西的奇妙感,如果神牛们早就知道了就无视掉我这篇胡扯的博文吧)
下面的n默认为是2的正整数次幂
传统FFT模板题,网上的传统做法是把a或b翻转过来,化成卷积形式然后直接做就可以了
但是我在做这道题的时候并没有想到这种方法,而是一直在考虑在多项式方面的问题,从一般感觉上来说,
我们知道一般形式为
抱着试一试与乱搞的心态,我写了一个这样的东西
那么多项式
处理
但是
抱着弃疗的心态输出了
静下心来仔细思考,我们在算出A,B的DFT,再做完向量乘法时,实际上的C是这样的
但在做逆DFT时,因为逆DFT是插值法,求出来的形式一定与多项式的一般形式相符合而不会出现负指数,而插值正好是2n次单位复数根的k(k=0~2n-1)次方,把负号移到它们头上,所求出来的项的次数是在
上面可能说的很模糊,举例来说,我们在
说白了,我们对
不得不说,这样做的基础就是n次单位复数根在乘法下构成n阶群以及插值法确定多项式的唯一性
(上面这句话是我瞎扯淡的,请无视)
代码:
#include<cstdio>#include<complex>using namespace std;int n;int pos[1<<18],bit[1<<18];const double pi=acos(-1.0);typedef complex<double> Co;Co a[1<<18],b[1<<18];void FFT(Co a[],bool tp,int len){ for (int i=0;i<len;++i) if (pos[i]>i) swap(a[pos[i]],a[i]); for (int i=2;i<=len;i=i<<1) { Co w(cos(2*pi/i),(tp?-1:1)*sin(2*pi/i)),wn,p,q; for (int j=0;j<len;j+=i) { wn=Co(1,0); for (int k=0;k<i/2;++k) p=a[k+j], q=wn*a[k+j+i/2], a[k+j]=p+q, a[k+j+i/2]=p-q, wn=w*wn; } }}main(){ scanf("%d",&n); for (int x,y,i=0;i<n;++i) scanf("%d%d",&x,&y), a[i]=Co(x,0),b[i]=Co(y,0); int wei=log2(n*2)+1,len=1<<wei; for (int t=1,i=0;i<wei;++i,t+=t) bit[t]=i; for (int i=1;i<len;++i) pos[i]=pos[i-(i&-i)]|(1<<wei-bit[i&-i]-1); FFT(a,0,len); FFT(b,1,len); for (int i=0;i<len;++i) a[i]=a[i]*b[i]; FFT(a,1,len); for (int i=0;i<n;++i) printf("%d\n",(int)(a[i].real()/len+0.5));}
- 【BZOJ2194】快速傅里叶之二,FFT和一点奇怪的想法
- 【bzoj2194】快速傅立叶之二 FFT
- BZOJ2194: 快速傅立叶之二 FFT
- [BZOJ2194]快速傅立叶之二(FFT)
- 【FFT】BZOJ2194 快速傅立叶之二
- 快速傅里叶变换 FFT 【bzoj2194】 快速傅立叶之二
- bzoj2194: 快速傅立叶之二
- [BZOJ2194]快速傅立叶之二
- BZOJ2194: 快速傅立叶之二
- bzoj2194 快速傅立叶之二
- [BZOJ2194]快速傅立叶之二
- BZOJ2194: 快速傅立叶之二
- bzoj2194 快速傅立叶之二
- bzoj2194 快速傅立叶之二
- bzoj2194: 快速傅立叶之二
- BZOJ2194: 快速傅立叶之二
- bzoj2194 快速傅立叶之二
- bzoj2194 快速傅立叶之二
- myeclipse10版本激活
- 定义颜色打印输出头文件"print_level.h"
- win7家庭版连接本地数据库问题
- BZOJ 1123: [POI2008]BLO 点双联通,Tarjan求割点
- 每日一道算法题——Container with Most Water
- 【BZOJ2194】快速傅里叶之二,FFT和一点奇怪的想法
- js异步编程的四种解决方案
- IIS发布网站后显示css js失败
- 类加载器与双亲委派模型
- 面试:Arrays.asList
- 动态规划 - 编辑距离
- AtCoder Grand Contest 010 B - Boxes 验证解的存在性
- LLVM教程(二)-- LLVM的安装
- redis linux-集群配置流程