FFT——[ZJOI2014]力

题目链接

题解:
我们通过移向后,再将后面的式子翻转一下,就可以看到两个式子都是卷积的形式了。然后FFT套一下板子就过了。

#include <bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
const long double PI=acos(-1.0);
struct Complex{
    long double x,y;
}A[500050],B[500050],C[500050];
Complex operator + (Complex a,Complex b)
{
    return {a.x+b.x,a.y+b.y};
}
Complex operator - (Complex a,Complex b)
{
    return {a.x-b.x,a.y-b.y};
}
Complex operator * (Complex a,Complex b)
{
    return {a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
}
int lim=1,l,r[4200000];
inline void FFT(Complex *A,int type)
{
    for (int i=0;i<lim;i++) if (i<r[i]) swap(A[i],A[r[i]]);
    for (int mid=1;mid<lim;mid<<=1){
        Complex Wn={cos(PI/mid),type*sin(PI/mid)};
        for (int j=0;j<lim;j+=(mid<<1)){
            Complex W={1,0};
            for (int k=0;k<mid;k++){
                Complex x=A[j+k],y=W*A[j+mid+k];
                A[j+k]=x+y;
                A[j+mid+k]=x-y;
                W=W*Wn;
            }
        }
    }
}
int main()
{
    int n=read();
    for (int i=1;i<=n;i++){
        scanf("%Lf",&A[i].x);
        B[n+1-i].x=A[i].x;
    }
    for (int i=1;i<=n;i++) C[i].x=(1.0/(long double)i)/(long double)i;
    while (lim<=2*n) {
        lim<<=1;
        l++;
    }
    for (int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    FFT(A,1);
    FFT(B,1);
    FFT(C,1);
    for (int i=0;i<=lim;i++){
        A[i]=A[i]*C[i];
        B[i]=B[i]*C[i];
    }
    FFT(A,-1);
    FFT(B,-1);
    for (int i=0;i<=lim;i++){
        A[i].x/=lim;
        B[i].x/=lim;
    }
    for (int i=1;i<=n;i++) printf("%.5Lf\n",A[i].x-B[n+1-i].x);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值