BZOJ 3527 [Zjoi2014] 力 FFT

题目大意:给出n个数qi,求这里写图片描述
n<=100000

暴力需要O(n2)的时间,想到用FFT加速(有规律的)乘法1
构造两个多项式
这里写图片描述
这里写图片描述
将两个多项式相乘,其中第n项到第2n-1项即为答案

#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 600000
using namespace std;
const double pi=acos(-1),DFT=2.0,IDFT=-2.0;
struct Complex {
    double x,y;
    Complex(const double& a=0.0,const double& b=0.0) : x(a),y(b) {}
    Complex operator + (const Complex& rhs) const {return Complex(x+rhs.x,y+rhs.y); }
    Complex operator - (const Complex& rhs) const {return Complex(x-rhs.x,y-rhs.y); }
    Complex operator * (const Complex& rhs) const {return Complex(x*rhs.x-y*rhs.y,x*rhs.y+y*rhs.x); }
}a[N],b[N],c[N];
int n,len,pos[N];
void init() {
    len=1;
    while(len<=n*2) len*=2;
    for(int i=1;i<len;i++) {
        pos[i]=pos[i/2]/2;
        if(i&1) pos[i]|=len/2;
    }
    return ;
}
void FFT(Complex x[],double mode) {
    for(int i=0;i<len;i++)
        if(i<pos[i])
            swap(x[i],x[pos[i]]);
    for(int i=2;i<=len;i*=2) {
        int step=i/2;
        Complex wm(cos(2*pi/i),sin(mode*pi/i));
        for(int j=0;j<len;j+=i) {
            int limit=j+step;
            Complex w(1,0);
            for(int k=j;k<limit;k++) {
                Complex l=x[k],r=w*x[k+step];
                x[k]=l+r; x[k+step]=l-r;
                w=w*wm;
            }
        }
    }
    if(mode==IDFT)
        for(int i=0;i<len;i++)
            x[i].x/=len;
    return ;
}
int main() {
    scanf("%d",&n);
    init();
    for(int i=0;i<n;i++) scanf("%lf",&a[i].x);
    for(int i=0;i<n-1;i++) b[i].x=-1.0/(n-i-1)/(n-i-1);
    for(int i=n;i<n*2-1;i++) b[i].x=1.0/(i-n+1)/(i-n+1);
    FFT(a,DFT); FFT(b,DFT);
    for(int i=0;i<len;i++) c[i]=a[i]*b[i];
    FFT(c,IDFT);
    for(int i=n-1;i<n*2-1;i++) printf("%f\n",c[i].x);
    return 0;
}

  1. 除法与乘法本质上相同。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值