• 【UOJ 34】多项式乘法


    FFT模板

    迭代的还没会 先写了个递归的

    define的PI 我也是神了!!  少上一位就会WA

    模板看的hzwer的

    因为 PI较短【...】所以递归的跑的和迭代的一样快 23333333

     还差的几点:

    1. acos要用

    2.complex要自己写(yts1999大爷说会被卡)

    3. 要改成迭代的

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <complex>
     4 #include <iostream>
     5 using namespace std;
     6 #define PI 3.14159265
     7 //const double PI =acos(-1);
     8 int n,m;
     9 complex<double> a[300000+1],b[300000+1];
    10 
    11 void FFT(complex<double> x[],int lenth,int type)
    12 {
    13     if(lenth==1return ;
    14     complex<double> p[lenth/2],q[lenth/2];
    15     for(int i=0;i<lenth;i++)
    16     if(i&1) p[i/2]=x[i];
    17     else q[i/2]=x[i];
    18     FFT(q,lenth/2,type);
    19     FFT(p,lenth/2,type);
    20     complex <double> wn(cos(2*PI/lenth),sin(type*2*PI/lenth)),t,w(1,0);
    21     for(int i=0;i<lenth/2;i++)
    22     {
    23         t=w*p[i];
    24         x[i]=q[i]+t;
    25         x[i+lenth/2]=q[i]-t;
    26         w*=wn;
    27     }
    28 }
    29 int main()
    30 {
    31     scanf("%d %d",&n,&m);int tmp;    
    32 
    33     for(int i=0;i<=n;i++) scanf("%d",&tmp),a[i]=tmp;
    34     for(int i=0;i<=m;i++) scanf("%d",&tmp),b[i]=tmp;
    35     m+=n;m++;
    36     n=1;
    37     for(;n<m;n*=2);
    38     FFT(a,n,1);
    39     FFT(b,n,1);
    40     for(int i=0;i<n;i++) a[i]*=b[i];
    41     FFT(a,n,-1);
    42     for(int i=0;i<m;i++) printf("%d ",(int)(a[i].real()/n+0.5));
    43     return 0;
    44 }

    Upd:1.24 WC RP++a啊

    #include <cstdio>
    #include <iostream>
    #include <complex>
    #include <cmath>
    using namespace std;
    const double PI=acos(-1);
    //#define PI 3.14159265
    #define C complex<double> 
    C a[300000],b[300000];
    int rev[300000];
    int n,m;
    void FFT(C x[],int type)
    {
        for(int i=0;i<n;i++) if(rev[i]<i) swap(x[i],x[rev[i]]);
    //    for(int i=0;i<n;i++) cout<<x[i]<<' ';cout<<endl;
        for(int i=2;i<=n;i*=2)
        {
            C wn(cos(2*PI/i),type*sin(2*PI/i));
        //    cout<<wn<<endl;
            for(int j=0;j<n;j+=i)
            {
                C w(1,0),t,tmp;
                for(int k=0;k<i/2;k++)
                {
                    tmp=x[j+k];
                    t=x[j+k+i/2]*w;
                    x[j+k]=tmp+t;
                    x[j+k+i/2]=tmp-t;
                    w=w*wn;
                }
            }
        }
    }
    int main()
    {
    //    freopen("a.in","r",stdin);
        scanf("%d %d",&n,&m);
        for(int i=0;i<=n;i++) scanf("%lf",&a[i]);
        for(int i=0;i<=m;i++) scanf("%lf",&b[i]);
        m=m+n+1;
        int ll=1;
        for(n=1;n<m;n*=2) ll++; ll-=2;//cout<<ll<<endl;
        for(int i=0;i<n;i++) rev[i]=(  ( rev[i/2]>>1 )  | ( (i&1)<<ll) );
        
        FFT(a,1);
        FFT(b,1);
        for(int i=0;i<n;i++)  a[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;
    }
  • 相关阅读:
    程序化广告交易中的点击率预估
    C++(三十七) — 字符串的函数重载—案例
    C++(三十六) — 等号操作符重载、&&,||不可重载
    C++(三十五) — 运算符重载
    C++(三十四) — 友元函数、友元类
    C++(三十三) — 全局函数、成员函数的区别
    C++(三十二) — 常对象、常成员变量、常成员函数
    C++(三十一) — 静态成员变量、静态成员函数
    C++(三十) — this 指针
    C++(二十九) — new 和 delete
  • 原文地址:https://www.cnblogs.com/ofsxb/p/5154038.html
Copyright © 2020-2023  润新知