看了一天的多项式的内容,看博客的时候好像还是那么回事,一看题,哇塞,发现我其实连卷积是啥都没看懂。

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学习的更多相关文章

  1. [大坑]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 ...

  2. 快速傅里叶变换(FFT)学习笔记

    定义 多项式 系数表示法 设\(A(x)\)表示一个\(n-1\)次多项式,则所有项的系数组成的\(n\)维向量\((a_0,a_1,a_2,\dots,a_{n-1})\)唯一确定了这个多项式. 即 ...

  3. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

  4. 快速傅里叶变换(FFT)学习笔记(其一)

    再探快速傅里叶变换(FFT)学习笔记(其一) 目录 再探快速傅里叶变换(FFT)学习笔记(其一) 写在前面 为什么写这篇博客 一些约定 前置知识 多项式卷积 多项式的系数表达式和点值表达式 单位根及其 ...

  5. 快速傅里叶变换(FFT)学习笔记(其二)(NTT)

    再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其二)(NTT) 写在前面 一些约定 前置知识 同余类和剩余系 欧拉定理 阶 原根 求原根 NTT ...

  6. 口胡FFT现场(没准就听懂了)&&FFT学习笔记

    前言(不想听的可以跳到下面) OK.蒟蒻又来口胡了. 自从ZJOI2019上Day的数论课上的多项式听到懵逼了,所以我就下定决心要学好多项式.感觉自己以前学的多项式都是假的. 但是一直在咕咕,现在是中 ...

  7. FFT学习及简单应用(一点点详细)

    什么是FFT 既然打开了这篇博客,大家肯定都已经对FFT(Fast Fourier Transformation)有一点点了解了吧 FFT即为快速傅里叶变换,可以快速求卷积(当然不止这一些应用,但是我 ...

  8. 【笔记篇】(理论向)快速傅里叶变换(FFT)学习笔记w

    现在真是一碰电脑就很颓废啊... 于是早晨把电脑锁上然后在旁边啃了一节课多的算导, 把FFT的基本原理整明白了.. 但是我并不觉得自己能讲明白... Fast Fourier Transformati ...

  9. 快速傅里叶变换FFT学习小记

    FFT学得还是有点模糊,原理那些基本还是算有所理解了吧,不过自己推这个推不动. 看的资料主要有这两个: http://blog.miskcoo.com/2015/04/polynomial-multi ...

  10. FFT学习笔记

    快速傅里叶变换FFT(Fast Fourior Transform) 先说一下它能干嘛qwq ​ 傅里叶变换有两种,连续傅里叶变换和离散傅里叶变换,OI中主要用来快速计算多项式卷积. 等一下,卷积是啥 ...

随机推荐

  1. go-gin-api 路由中间件 - 签名验证(七)

    概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大 ...

  2. CopyOnWriteArraySet 源码分析

    CopyOnWriteArraySet  源码分析: 1:数据结构: private final CopyOnWriteArrayList<E> al; 内部维护的是一个CopyOnWri ...

  3. .tar.gz 文件和 .tar.xz 文件的区别

    tar.gz and tar.xz both are compressed tar-files, but with different compression methods. tar.gz is c ...

  4. go 中string[0]到底是rune还是byte?

    好像没区别,对吧? 来看个全面的对比: package main import ( "fmt" "reflect") func main(){ asci:=&q ...

  5. css实现保持div的等宽高比

    这篇文章主要为回答这个问题:“做响应式网页,如何让一个div的高和宽保持比例放大或是缩小?”,这里不介绍媒体查询的实现. 那么css如何实现高度height随宽度width变化保持比例不变呢?即给定可 ...

  6. i春秋——“百度杯”CTF比赛 十月场——Login

    根据页面源码提示的 test1 test1 登录 刷新此页面并抓包,有个show=0值得关注 在发送的包的header中加一句show:1,即可得到member.php的源码 <?php inc ...

  7. 本机安装mysql步骤

    原文:https://www.cnblogs.com/dukeShi/p/6546024.html 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具) 因为这段时间不是装系统就是 ...

  8. Jmeter 使用自定义变量

    有些情况下比如发起测试时URL的主机名和端口需要在采样器中出现多次,这样就有个问题,当测试的主机更改时, 我们需要修改主机名称,这时就需要修改多个地方,如果多的情况会有遗漏.如果我们在配置脚本的时候, ...

  9. Linux shell 中断循环语句

    无限循环: 循环有限的生命,他们跳出来,一旦条件是 false 还是 false 取决于循环. 由于所需的条件是不符合一个循环可能永远持续下去.永远不会终止执行一个循环执行无限次数.出于这个原因,这样 ...

  10. Linux的web服务的介绍

    web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的.全球性的.动态交互的.跨平台的分布式图形信息系统.是建立在Internet上的一种网络服务,为浏览者在 ...