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中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...
随机推荐
- [转帖]linux lsof 用法简介
linux lsof 用法简介 https://www.cnblogs.com/saneri/p/5333333.html 1.简介: lsof(list open files)是一个列出当前系统打开 ...
- IScroll在某些win10版本下的奇怪问题
客户的电脑环境: win10版本 企业微信: useragent mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.36 (khtml, like ...
- Kuboard Kubernetes安装
一.简介 Kubernetes 容器编排已越来越被大家关注,然而使用 Kubernetes 的门槛却依然很高,主要体现在这几个方面: 集群的安装复杂,出错概率大 Kubernetes相较于容器化,引入 ...
- 最简单的 kubernetes 高可用安装方式
sealos 项目地址:https://github.com/fanux/sealos 本文教你如何用一条命令构建 k8s 高可用集群且不依赖 haproxy 和 keepalived,也无需 ans ...
- 《STL源码剖析》——Array
array array本身内容较少,日常使用也不是很多,里面也没有很高深的技巧 1 array的基本架构 了解array的架构需要一个额外的语法知识: int a[100]; int [100]b; ...
- asp.net core不通过构造方法从容器中获取对象及解决通过这种方法NLog获取对象失败的问题
一般想从容器中获取对象,我们都是通过构造方法获取对象,但有些条件不允许不能通过构造方法获取对象,我们必须单独从容器中单独创建获取找个对象,这样我们就不行把找个容器静态保存起来供全局diaoy 一. 简 ...
- vue-Element-axios搭建调用api进行数据展示
1全局安装vue-cli 输入命令:npm install vue-cli -g 2创建项目框架 输入命令:vue init webpack vueapi 3依次按照提示输入,项目名.项目描述.项目作 ...
- 何为KVM克隆和快照
KVM的克隆.快照都是老生常谈的问题,资料也非常多,这里只是针对个人实验的记录,方便以后查阅. 虚拟机克隆 虚拟机的克隆操作是再频繁不过了,安装好第一台虚拟机后就可以进行基础设置,已此虚拟机为模板,以 ...
- Spring事件监听机制
前言 Spring中的事件机制其实就是设计模式中的观察者模式,主要由以下角色构成: 事件 事件监听器(监听并处理事件) 事件发布者(发布事件) 首先看一下监听器和发布者的接口定义 public int ...
- SQL Server Compact 3.5环境部署<转>
通过使用 Microsoft Visual Studio 开发环境,可以开发使用 SQL Server Compact 3.5 的应用程序.Visual Studio 是开发和部署使用 SQL Ser ...