void FFT(complex a[],int n,int fl){
for (int i=,j=n/;i<n;i++){
if (i<j) {complex t=a[i];a[i]=a[j];a[j]=t;};
int k;
for (k=(n>>);j&k;j^=k,k>>=);
j^=k;
} for (int i=;i<=n;i<<=){
complex w;w.r=cos(fl**pi/i);w.i=sin(fl**pi/i);
for (int j=;j<n;j+=i){
complex wi;wi.r=;wi.i=;
for (int k=j;k<j+i/;k++){
complex u=a[k],v=a[k+i/]*wi;
a[k]=u+v;a[k+i/]=u-v;
wi=wi*w;
}
}
} if (fl==-) for (int i=;i<n;i++) a[i].r/=n;
}

fl==1求点值 fl==-1插值

_________________________
DFT

void DFT(){
for (int i=;i<n;i++){
cp t=(cp){cos(*pi/n*i),sin(*pi/n*i)},bas=(cp){,};
for (int j=;j<n;j++){
tmp[i]=tmp[i]+bas*a[j];
bas=bas*t;
}
}
for (int i=;i<n;i++) a[i]=tmp[i];
} void IDFT(){
for (int i=;i<n;i++) P[i].r=P[i].i=;
for (int i=;i<n;i++){
cp t=(cp){cos(-*pi/n*i),sin(-*pi/n*i)},bas=(cp){,};
for (int j=;j<n;j++){
P[i]=P[i]+tmp[j]*bas;
bas=bas*t;
}
} for (int i=;i<n;i++) P[i].r=(int)(P[i].r/n+0.5);
}

-------------------------------------------------------------------------

CODECHEF JUNE15 MOREFB

系数为多项式的分治FFT

#include <bits/stdc++.h>
#define LL long long
#define LDB long double
using namespace std; const LDB pi=acos(-);
const LL mo=; int a[],n,k; struct data{
LL a_1,a_n;
}; inline data operator*(data a,data b) {return((data){(a.a_n*b.a_n+a.a_1*b.a_1)%mo,(a.a_n*b.a_n+a.a_1*b.a_n+a.a_n*b.a_1)%mo});}; struct cp{
LDB r_1,r_n,r_n2,i_1,i_n,i_n2; void set0(){
r_1=r_n=r_n2=i_1=i_n=i_n2=;
} void set(data a){
set0();
r_1=a.a_1;r_n=a.a_n;
}
}A[],B[]; inline cp operator *(cp a,cp b){
return((cp)
{
a.r_1*b.r_1-a.i_1*b.i_1,
a.r_n*b.r_1+a.r_1*b.r_n-a.i_n*b.i_1-a.i_1*b.i_n,
a.r_n2*b.r_1+a.r_n*b.r_n+a.r_1*b.r_n2-a.i_n2*b.i_1-a.i_n*b.i_n-a.i_1*b.i_n2,
a.r_1*b.i_1+a.i_1*b.r_1,
a.r_n*b.i_1+a.r_1*b.i_n+a.i_n*b.r_1+a.i_1*b.r_n,
a.r_n2*b.i_1+a.r_n*b.i_n+a.r_1*b.i_n2+a.i_n2*b.r_1+a.i_n*b.r_n+a.i_1*b.r_n2
});
} inline cp operator +(cp a,cp b){
return((cp)
{
a.r_1+b.r_1,
a.r_n+b.r_n,
a.r_n2+b.r_n2,
a.i_1+b.i_1,
a.i_n+b.i_n,
a.i_n2+b.i_n2,
});
} inline cp operator -(cp a,cp b){
return((cp)
{
a.r_1-b.r_1,
a.r_n-b.r_n,
a.r_n2-b.r_n2,
a.i_1-b.i_1,
a.i_n-b.i_n,
a.i_n2-b.i_n2,
});
} data getkth(int po){
data ret;ret.a_1=;ret.a_n=;
data bas;bas.a_1=;bas.a_n=;
for (;po;bas=bas*bas){
if (po&) ret=ret*bas;
po>>=;
}
return(ret);
} void FFT(cp a[],int n,int fl){
for (int i=,j=n/;i<n;i++){
if (i<j) {cp t=a[i];a[i]=a[j];a[j]=t;};
int k;
for (k=(n>>);j&k;j^=k,k>>=);
j^=k;
} for (int i=;i<=n;i<<=){
cp w;w.set0();
w.r_1=cos(fl**pi/i);w.i_1=sin(fl**pi/i);
for (int j=;j<n;j+=i){
cp wi;wi.set0();
wi.r_1=;wi.i_1=;
for (int k=j;k<j+i/;k++){
cp u=a[k],v=a[k+i/]*wi;
a[k]=u+v;a[k+i/]=u-v;
wi=wi*w;
}
}
} if (fl==-) for (int i=;i<n;i++) a[i].r_n2/=n,a[i].r_n/=n,a[i].r_1/=n;
}
vector <data> MUL(vector <data> &a,vector <data> &b){
int n=;
while (n<a.size()+b.size()) n<<=;
for (int i=;i<n;i++){
if (i<a.size()) A[i].set(a[i]);else A[i].set0();
if (i<b.size()) B[i].set(b[i]);else B[i].set0();
} FFT(A,n,);FFT(B,n,);
for (int i=;i<n;i++) A[i]=A[i]*B[i];
FFT(A,n,-); vector <data> ret;ret.resize(a.size()+b.size());
for (int i=;i<a.size()+b.size();i++){
LL tn2=(A[i].r_n2+0.5),tn=(A[i].r_n+0.5),t1=(A[i].r_1+0.5);
ret[i].a_n=(tn2+tn)%mo;ret[i].a_1=(tn2+t1)%mo;
}
return(ret);
} void show(vector <data> tmp1,vector <data> tmp2){
for (int i=;i<tmp1.size();i++) printf("%lld %lld|",tmp1[i].a_n,tmp1[i].a_1);printf("\n");
for (int i=;i<tmp2.size();i++) printf("%lld %lld|",tmp2[i].a_n,tmp2[i].a_1);printf("\n");
vector <data> res=MUL(tmp1,tmp2);
for (int i=;i<res.size();i++) printf("%lld %lld|",res[i].a_n,res[i].a_1);printf("\n\n");
} vector <data> solve(int l,int r){
if (l==r){
vector <data> ret;ret.resize();
ret[].a_1=;ret[].a_n=;
ret[]=getkth(a[l]);
return(ret);
} int mid=(l+r)>>;
vector <data> tmp1=solve(l,mid);
vector <data> tmp2=solve(mid+,r);
// show(tmp1,tmp2);
return(MUL(tmp1,tmp2));
} int main(){
scanf("%d%d",&n,&k);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
vector <data> ans=solve(,n);
printf("%lld\n",ans[k].a_n%mo);
}

FFT的更多相关文章

  1. 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)

    对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...

  2. 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT

    2179: FFT快速傅立叶 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2978  Solved: 1523[Submit][Status][Di ...

  3. 为什么FFT时域补0后,经FFT变换就是频域进行内插?

    应该这样来理解这个问题: 补0后的DFT(FFT是DFT的快速算法),实际上公式并没变,变化的只是频域项(如:补0前FFT计算得到的是m*2*pi/M处的频域值, 而补0后得到的是n*2*pi/N处的 ...

  4. FFT NNT

    算算劳资已经多久没学新算法了,又要重新开始学辣.直接扔板子,跑...话说FFT算法导论里讲的真不错,去看下就懂了. //FFT#include <cstdio> #include < ...

  5. CC countari & 分块+FFT

    题意: 求一个序列中顺序的长度为3的等差数列. SOL: 对于这种计数问题都是用个数的卷积来进行统计.然而对于这个题有顺序的限制,不好直接统计,于是竟然可以分块?惊为天人... 考虑分块以后的序列: ...

  6. ECF R9(632E) & FFT

    Description: 上一篇blog. Solution: 同样我们可以用fft来做...就像上次写的那道3-idoit一样,对a做k次卷积就好了. 同样有许多需要注意的地方:我们只是判断可行性, ...

  7. fft练习

    数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...

  8. FFT时域与频域的关系,以及采样速率与采样点的影响

    首先对于FFT来说,输入的信号是一个按一定采样频率获得的信号序列,而输出是每个采样点对应的频率的幅度(能量). 下面详细分析: 在FFT的输出数据中,第一个值是直流分量的振幅(这样对应周期有无穷的可能 ...

  9. 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

    前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...

随机推荐

  1. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

  2. C# Stream 和 byte[] 之间的转换

    一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...

  3. 关于ArcGIS API for JavaScript中basemap的总结介绍(一)

    实际上basemap这个概念并不只在arcgis中才有,在Python中有一个matplotlib basemap toolkit(https://pypi.python.org/pypi/basem ...

  4. python的基础知识

    Python文件命名时不要有中文,不然在dos中不能执行 D:\Program Files\Py>Python hellyy.pyYear:2016Month(1-12):1Day(1-31): ...

  5. ViewPager+GridView实现横向滑动 仿大众点评

    先看演示效果: 1  ViewPager类提供了多界面切换的新效果. 新效果有如下特征: [1] 当前显示一组界面中的其中一个界面. [2] 当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界 ...

  6. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  7. Linux磁盘空间监控告警

    Linux系统中需要监控磁盘各分区的使用情况,避免由于各种突发情况,造成磁盘空间被消耗殆尽的情况,例如某个分区被Oracle的归档日志耗尽,导致后续的日志文件无法归档,这时ORACLE数据库就会出现错 ...

  8. Linux如何查看JDK的安装路径

    如何在一台Linux服务器上查找JDK的安装路径呢? 有那些方法可以查找定位JDK的安装路径?是否有一些局限性呢? 下面总结了一下如何查找JDK安装路径的方法.   1:echo $JAVA_HOME ...

  9. SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑

    本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...

  10. 从零自学Hadoop(01):认识Hadoop

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 序 Hadoop 项目起源 优点 核心 ...