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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- Kubernetes ingress 上传文件大小限制
1.文件太大 413:Request Entity Too Large 创建 ingress 时添加 annotations(注释) metadata: annotations: nginx.ingr ...
- 使用python把gdb格式的文本文件转为utf-8的格式
# coding=utf-8 from os import listdir if __name__ =="__main__": d=u"D:\\files\\" ...
- 2019-11-29-WPF-开启-ScrollViewer-的触摸滚动
原文:2019-11-29-WPF-开启-ScrollViewer-的触摸滚动 title author date CreateTime categories WPF 开启 ScrollViewer ...
- asp.net web 项目 针对aspx和ashx的 IHttpHandlerFactory 开发
ASP.NET Framework处理一个Http Request的流程: HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNE ...
- 我是如何一步步编码完成万仓网ERP系统的(八)产品库设计 4.品牌类别
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- c# 编码风格
此内容为copy别人的,仅供自己参看.如有意见,麻烦通知我,谢谢 1. C# 代码风格要求 1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释. 如果类型.属性.事件.方法.方法参数的名称 ...
- 利用Python读取图片exif敏感信息
众所周知,现在很多的照相机等软件,拍摄会有选项,是否包含位置信息等. 当然有的人会说,我在微信中查看图片exif信息并没有啊,这是因为你发送到微信服务器的时候,微信帮你完成了保密工作. 常见的图片中包 ...
- ELK日志系统之说说logstash的各种配置
当我们在设置配置logstash的conf文件内容时,日志数据的来源有以下几种配置: tcp形式:一个项目或其他日志数据来源用tcp协议的远程传输方式,将日志数据传入logstash input { ...
- Solr搜索器的特性及相关操作
一.搜索处理器简介 所有的请求处理器都实现一个Java类,本例实现了solr.SearchHandler.在运行时,solr.SearchHandler被解析为内置的Solr类org.apache.s ...
- CentOS7升级内核kernel5.0
升级过程: 原系统:CentOS7.3 [root@my-e450 ~]# uname -r3.10.0-514.el7.x86_64 安装必需的软件包: # yum update# yum inst ...