洛谷P3338:力(FFT)
生活随笔
收集整理的這篇文章主要介紹了
洛谷P3338:力(FFT)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門
解析
算是比較適合的FFT入門題了吧
一個(gè)重要的trick:
當(dāng)函數(shù)無(wú)法表示成卷積時(shí),可以把函數(shù)翻轉(zhuǎn)過(guò)來(lái)
然后調(diào)一調(diào)就又是卷積了
一個(gè)重要的注意事項(xiàng)是FFT的lim一定是兩多項(xiàng)式相乘結(jié)果多項(xiàng)式的項(xiàng)數(shù)!
即使后面的項(xiàng)根本沒(méi)有用也一樣
其他的比較簡(jiǎn)單了
注意下精度即可
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long #define il inline const int N=1e6+100; const int M=150; const int mod=998244353; const double pi=acos(-1.0); inline ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m,lim,k; struct node{double x,y;node(double a=0,double b=0){x=a;y=b;} }A[N],B[N],C[N]; il node operator * (node a,node b){return (node){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x}; } il node operator + (node a,node b){return (node){a.x+b.x,a.y+b.y}; } il node operator - (node a,node b){return (node){a.x-b.x,a.y-b.y}; } int r[N]; il void fft(node *x,int lim,int flag){for(int i=0;i<=lim;i++){if(i<r[i]) swap(x[i],x[r[i]]);}for(int l=1;l<lim;l<<=1){node o(cos(pi/l),flag*sin(pi/l));for(int st=0;st<=lim;st+=l<<1){node t(1,0);for(int j=0;j<l;j++,t=t*o){node u=x[st+j],v=t*x[st+j+l];x[st+j]=u+v;x[st+j+l]=u-v;}}}return; } int main(){n=read();for(int i=1;i<=n;i++){scanf("%lf",&A[i].x);B[i].x=(double)(1.0/i/i);C[n-i].x=A[i].x;}int L=0,lim=1;while(lim<=n<<1){lim<<=1;L++;}for(int i=1;i<=lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));fft(A,lim,1);fft(B,lim,1);fft(C,lim,1);for(int i=0;i<=lim;i++){A[i]=A[i]*B[i];C[i]=C[i]*B[i];}fft(A,lim,-1);fft(C,lim,-1);for(int i=1;i<=n;i++) printf("%lf\n",(A[i].x-C[n-i].x)/lim);return 0; } /**/總結(jié)
以上是生活随笔為你收集整理的洛谷P3338:力(FFT)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 逆水寒岁月神偷最后奖励选什么好?奖励一览
- 下一篇: 多项式乘法:练习总结