zoukankan      html  css  js  c++  java
  • FFT

    背诵全文

    #include<complex>
    #include<vector>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define C complex<double>
    using namespace std;
    inline int gi()
    {
        int res=0,fh=1;char ch=getchar();
        while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
        if(ch=='-')fh=-1,ch=getchar();
        while(ch>='0'&&ch<='9')res=res*10+ch-'0',ch=getchar();
        return fh*res;
    }
    const int MAXN=270050;
    const double pi=acos(-1);
    int n,m,L;
    int R[MAXN];
    C a[MAXN],b[MAXN];
    void fft(C *a,int f)
    {
        for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);//交换位置
        for(int i=1;i<n;i<<=1)//待合并区间长度
        {
            C wn(cos(pi/i),sin(f*pi/i)),x,y;//这里就不用再*2了,因为合并后的区间长度是i的两倍
            for(int j=0;j<n;j+=i<<1)//起始位置
            {
                C w(1,0);
                for(int k=0;k<i;k++,w*=wn)//第k个
                {
                    x=a[j+k];y=w*a[j+i+k];
                    a[j+k]=x+y;
                    a[j+i+k]=x-y;
                }
            }
        }
    }
    int main()
    {
        n=gi();m=gi();
        for(int i=0;i<=n;i++)a[i]=gi();
        for(int i=0;i<=m;i++)b[i]=gi();
        m+=n;
        for(n=1;n<=m;n<<=1)L++;
        for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));//递推
        fft(a,1);fft(b,1);
        for(int i=0;i<=n;i++)a[i]*=b[i];
        fft(a,-1);
        for(int i=0;i<=m;i++)printf("%d ",int(a[i].real()/n+0.5));
        return 0;
    }
    View Code
  • 相关阅读:
    Action常见注解的运用
    发现越来越喜欢来博客园了,所以自己也注册了一个!
    jsf 繁体教程下载pdf
    poj3210
    poj3224
    poj3219
    poj3233
    poj3372
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    年轻就该多尝试,教你20小时Get一项新技能
  • 原文地址:https://www.cnblogs.com/Kong-Ruo/p/8025135.html
Copyright © 2011-2022 走看看