FFT学习
看了一天的多项式的内容,看博客的时候好像还是那么回事,一看题,哇塞,发现我其实连卷积是啥都没看懂。
qtdydb,背板子。 不知道卷积是啥就很伤了。
P3803 【模板】多项式乘法(FFT)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=4e6+;
const double pi=acos(-); int n,m,bit,len=;
int rev[N]; struct Complex
{
double x,y;
Complex(double xx=,double yy=){x=xx,y=yy;}
Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N]; void fft(Complex *A,int dft)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int step=;step<len;step<<=)
{
Complex wn(cos(pi/step),dft*sin(pi/step));
for(int j=;j<len;j+=(step<<))
{
Complex wnk(,);
for(int k=j;k<step+j;++k)
{
Complex x=A[k],y=wnk*A[k+step];
A[k]=x+y,A[k+step]=x-y;
wnk=wnk*wn;
}
}
}
if(dft==) return;
for(int i=;i<=n+m;++i) A[i].x/=len;
} int main()
{
n=read(),m=read();
for(int i=;i<=n;++i) a[i].x=read();
for(int i=;i<=m;++i) b[i].x=read();
while(len<=n+m) len<<=,++bit;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
fft(a,),fft(b,);
for(int i=;i<=len;++i) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<=n+m;++i)
cout<<(int)(a[i].x+0.5)<<' ';
return ;
}
P3338 [ZJOI2014]力
不会,抄的
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=4e5+;
const double pi=acos(-); int n,m,bit,len=,rev[N]; struct Complex
{
double x,y;
Complex(double xx=,double yy=){x=xx,y=yy;}
Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N],c[N]; void fft(Complex *A,int dft)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=;i<len;i<<=)
{
Complex wn(cos(pi/i),dft*sin(pi/i));
for(int j=,t=i*;j<len;j+=t)
{
Complex wnk(,);
for(int k=j;k<i+j;++k)
{
Complex x=A[k],y=wnk*A[k+i];
A[k]=x+y,A[k+i]=x-y;
wnk=wnk*wn;
}
}
}
if(dft==) return;
for(int i=;i<=len;++i) A[i].x/=len;
} int main()
{
n=read();
for(int i=;i<=n;++i) scanf("%lf",&a[i].x),b[n-i+].x=a[i].x;
for(int i=;i<=n;++i) c[i].x=1.0/(1ll*i*i);
while(len<=(n<<)) ++bit,len<<=;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
fft(a,),fft(b,),fft(c,);
for(int i=;i<=len;++i) a[i]=a[i]*c[i],b[i]=b[i]*c[i];
fft(a,-),fft(b,-);
for(int i=;i<=n;++i) printf("%.3lf\n",a[i].x-b[n-i+].x);
return ;
}
2194: 快速傅立叶之二
不会,抄的。 好像知道fft/卷积一拉子是干什么的了。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=4e5+;
const double pi=acos(-); int n,bit,len=,rev[N]; struct Complex
{
double x,y;
Complex(double a=,double b=){x=a,y=b;}
Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N]; void fft(Complex *A,int dft)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=;i<len;i<<=)
{
Complex wn(cos(pi/i),dft*sin(pi/i));
for(int j=,t=i<<;j<len;j+=t)
{
Complex wnk(,);
for(int k=j;k<i+j;++k)
{
Complex x=A[k],y=wnk*A[k+i];
A[k]=x+y,A[k+i]=x-y;
wnk=wnk*wn;
}
}
}
if(dft==) return;
for(int i=;i<len;++i) A[i].x/=len;
} int main()
{
n=read();
for(int i=;i<n;++i)
{
a[n-i-].x=read();
b[i].x=read();
}
while(len<=(n<<)) len<<=,++bit;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
fft(a,),fft(b,);
for(int i=;i<=len;++i) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<n;++i)
printf("%d\n",(int)(a[n-i-].x+0.5));
return ;
}
3513: [MUTC2013]idiots
不会,抄的。还是不知道fft/卷积一拉子是干什么的。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=4e5+;
const double pi=acos(-); int n,bit,len=,rev[N];
LL g[N],t[N]; struct Complex
{
double x,y;
Complex(double a=,double b=){x=a,y=b;}
Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}f[N]; void fft(Complex *A,int dft)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=;i<len;i<<=)
{
Complex wn(cos(pi/i),dft*sin(pi/i));
for(int j=,t=i<<;j<len;j+=t)
{
Complex wnk(,);
for(int k=j;k<i+j;++k)
{
Complex x=A[k],y=wnk*A[k+i];
A[k]=x+y,A[k+i]=x-y;
wnk=wnk*wn;
}
}
}
if(dft==) return;
for(int i=;i<=len;++i) A[i].x/=len;
} int main()
{
int T=read();
while(T--)
{
memset(g,,sizeof(g)),memset(t,,sizeof(t));
memset(f,,sizeof(f));
n=read();int mx=;LL sum;
for(int i=,a;i<=n;++i)
{
a=read();mx=max(mx,a);
--g[a<<],++t[a],++f[a].x;
}
for(int i=mx;i;--i) t[i]+=t[i+];
mx<<=,sum=1ll*n*(n-)*(n-)/;
len=,bit=;while(len<=mx) len<<=,++bit;
for(int i=;i<=len;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
fft(f,);
for(int i=;i<=len;++i) f[i]=f[i]*f[i];
fft(f,-);
for(int i=;i<=len;++i) g[i]+=1ll*(f[i].x+0.5);
LL ans=;
for(int i=;i<=len;++i) ans+=(g[i]/)*t[i];
ans=sum-ans;
printf("%.7lf\n",1.0*ans/sum);
}
return ;
}
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=,f=;
for(;!isdigit(c);c=getchar())
f=c=='-'?-:f;
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num*f;
} const int N=3e5+;
const double pi=acos(-); int n,m,len=,bit,rev[N]; struct Complex
{
double x,y;
Complex(double a=,double b=){x=a,y=b;}
Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N]; void fft(Complex *A,int dft)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(A[i],A[rev[i]]);
for(int i=;i<len;i<<=)
{
Complex wn(cos(pi/i),dft*sin(pi/i));
for(int j=,t=i<<;j<len;j+=t)
{
Complex wnk(,);
for(int k=j;k<i+j;++k)
{
Complex x=A[k],y=wnk*A[k+i];
A[k]=x+y,A[k+i]=x-y;
wnk=wnk*wn;
}
}
}
if(dft==) return;
for(int i=;i<=len;++i) A[i].x=A[i].x/len+0.5;
} int main()
{
n=read(),m=read();LL a1=,a2=,b1=,b2=;
for(int i=;i<=n;++i)
{
a[i].x=a[n+i].x=read();
a1+=a[i].x*a[i].x,a2+=a[i].x;
}
for(int i=;i<=n;++i)
{
b[n-i+].x=read();
b1+=b[n-i+].x*b[n-i+].x,b2+=b[n-i+].x;
}
while(len<=(n*)) len<<=,++bit;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<(bit-));
fft(a,),fft(b,);
for(int i=;i<=len;++i) a[i]=a[i]*b[i];
fft(a,-);
LL ans=1ll<<,sum=ans;
for(int j=-m;j<=m;++j) sum=min(sum,a1+b1+n*j*j+2ll*j*(a2-b2));
for(int i=;i<=n;++i) ans=min(ans,sum-2ll*(LL)a[n+i].x);
cout<<ans;
return ;
}
真tm难啊
FFT学习的更多相关文章
- [大坑]FFT学习
[大坑]FFT学习 Macros #define fon(i,s) for(int i=0;i<s; ++i) #define fone(i,s) for(int i=0;i<=s;++i ...
- 快速傅里叶变换(FFT)学习笔记
定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 快速傅里叶变换(FFT)学习笔记(其一)
再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...
- 快速傅里叶变换(FFT)学习笔记(其二)(NTT)
再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...
- 口胡FFT现场(没准就听懂了)&&FFT学习笔记
前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...
- FFT学习及简单应用(一点点详细)
什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...
- 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w
现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...
- 快速傅里叶变换FFT学习小记
FFT学得还是有点模糊,原理那些基本还是算有所理解了吧,不过自己推这个推不动. 看的资料主要有这两个: http://blog.miskcoo.com/2015/04/polynomial-multi ...
- FFT学习笔记
快速傅里叶变换FFT(Fast Fourior Transform) 先说一下它能干嘛qwq 傅里叶变换有两种,连续傅里叶变换和离散傅里叶变换,OI中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- 是的 你没看错!!!用JAVA为MCU开发物联网程序?
是的 你没看错!!!用JAVA为MCU开发物联网程序? 一直以来,物联网设备这种嵌入式硬件,对于Java软件开发者来说,就是Black Magic Box,什么中断.寄存器,什么 ...
- linux kernel debug
1. sysrq http://www.chinaunix.net/old_jh/4/902287.html 常用的SysRq命令(序列) 重启机器的SysRq命令序列是 k(SAK) s(sync ...
- 项目Gradle版本从4.4升级到4.6
一.背景 Gralde版本与AGP(Android Gradle Plugin)版本具有一定的对应关系,原因在于AGP实质上作为Gradle的插件,依赖于Gradle作为宿主.因此,不同的AGP版本需 ...
- DNS 服务器无法正常解析时,可以尝试这样!
DNS 服务器无法正常解析时,可以尝试这样! ========================================================================联通:12 ...
- RabbitMQ消息中间件的用法
1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消 ...
- element admin中使用nprogress实现页面加载进度条
主要是知道是nprogress这个组件实现的就可以了,组件的使用方法可参考:https://blog.csdn.net/ltr15036900300/article/details/47321217 ...
- MySQL查询——select
SELECT select的完整语法: select col1, col2,... # 业务查询的字段 from table_name # 选取的哪张表 [where single_condition ...
- windows下查看webp格式图片
关于webp 时下webp格式日渐势起,主流浏览器(IE: ???)已经开始支持webp,诸多互联网企业(Facebook 和 ebay,国内的有淘宝.腾讯和美团等)都已经在不遗余力的将webp应用到 ...
- CDH5.13快速体验
相对于易用性很差Apache Hadoop,其他商业版Hadoop的性能易用性都有更好的表现,如Cloudera.Hortonworks.MapR以及国产的星环,下面使用CDH(Cloudera Di ...
- 性能测试基础---jmeter webservice接口测试
·webservice接口测试实现.·SOA:面向服务的体系架构,主要为了应对大型系统的异构需求.典型的实现方式:webservice·微服务:为了对SOA这样的重服务架构进行解耦而存在的.一个or几 ...