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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- [转帖]几张图让你看懂WebAssembly
几张图让你看懂WebAssembly https://www.jianshu.com/p/bff8aa23fe4d (图片来源:giphy.com) 编者按:本文由明非在众成翻译平台上翻译. ...
- Scala中sortBy和Spark中sortBy区别
Scala中sortBy是以方法的形式存在的,并且是作用在Array或List集合排序上,并且这个sortBy默认只能升序,除非实现隐式转换或调用reverse方法才能实现降序,Spark中sortB ...
- 关于预装操作系统的ThinkPad的分区建议
Think的个人电脑产品大部分预装有正版操作系统,当前新产品出厂时默认都是一个大分区“C”和一个恢复分区“Q”,很多用户都会要求客服人员提供分区服务,在这里我简单说一下关于分区的几点注意事项望各位参考 ...
- 2019年,Golang开始吊打Java性能了!!!
最近要同事debug性能,不经意间发现现在Golang性能开始吊打Java了!!!感觉Go发展神速!! 之前Go和Java基本是平手,甚至还有较大差距,请见https://www.cnblogs.co ...
- python 排序 归并排序
算法思想 迭代法: 归并算法一共有两种思想,笼统的说,这两种思想的区别就在于一种不分割未排序的序列(直接将序列看为n个个数为1的子序列),这种称为---迭代法 直接从队头开始,两两合并为一个个数为2的 ...
- Lambda表达式---Day27
函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,也就是“拿什么东西做什么事情”.相对而言,面向对象过 分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语 ...
- 基于vue+springboot+docker网站搭建【六】安装中间件
安装中间件 去另外一台2核4G的机器先安装docker,然后安装后台项目使用的中间件 一.mysql 下载镜像:docker pull mysql:5.7 启动镜像实例:docker run -p 3 ...
- Mac切换root用户
sudo su 然后输入密码,用户名显示sh-3.2#,这里的#代表的含义就是具有root权限 这时,再输入 su - 就可以进入root用户 那接下来,如果我们要切换至普通用户该怎么做? su - ...
- 2019-09-16 curl简单操作
1.get请求 (使用file_get_contents()函数也可以实现get请求) //http_build_query() 构造一个url字符串 function http_get($url) ...
- 把JSON数据格式转换为Python的类对象
JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": ...