zoukankan      html  css  js  c++  java
  • 多项式乘法 FFT模板

    题目传送门

    在下只是来存个板子,,(板子还是洛谷找的2333)

    证明的话,太(wo)难(bu)写(hui),就先留个坑吧,,,

    NOIP后,如果没退役,我会回来填坑的,,

    #include<bits/stdc++.h>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<deque>
    #include<list>
    #include<set>
    #include<vector>
    #include<iostream>
    #define ll long long
    #define re register
    #define inf 0x7f7f7f7f
    #define inl inline
    #define sqr(x) (x*x)
    //#define eps 1e-8
    #define debug printf("debug
    ");
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    //#pragma GCC optimize (2)
    //#pragma G++ optimize (2)
    using namespace std;
    //const ll mod;
    const double Pi=acos(-1.0);
    const ll MAXN=1e7+10;
    inl ll read() {
        re ll x = 0; re int f = 1;
        char ch = getchar();
        while(ch<'0'||ch>'9') { if(ch== '-' ) f = -1; ch = getchar(); }
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        return x * f;
    }
    inl char readc() {
        char ch=getchar();
        while(('z'<ch||ch<'a')&&('Z'<ch||ch<'A')) ch=getchar();
        return ch;
    }
    inl void write(re ll x){
        if(x>=10)write(x/10);
        putchar(x%10+'0');
    }
    inl void writeln(re ll x){
        if(x<0) {x=-x;putchar('-');}
        write(x); puts("");
    }
    inl ll gcd(re ll x,re ll y){while(y^=x^=y^=x%=y);return x;}
    inl ll Lcm(re ll a,re ll b) {return a/gcd(a,b)*b;}
    inl void FR() {
        freopen(".in","r",stdin);
        freopen(".out","w",stdout);
    }
    inl void FC() {
        fclose(stdin);
        fclose(stdout);
    }
    struct cmplex{
        double x,y;
        cmplex (double xx=0,double yy=0) {x=xx;y=yy;}
        cmplex operator + (const cmplex &ch) const {return cmplex(x+ch.x,y+ch.y);} 
        cmplex operator - (const cmplex &ch) const {return cmplex(x-ch.x,y-ch.y);} 
        cmplex operator * (const cmplex &ch) const {return cmplex(x*ch.x-y*ch.y,x*ch.y+y*ch.x);} 
    }a[MAXN],b[MAXN];
    ll n,m,l,r[MAXN],limit=1;
    inl void fft(cmplex *a,ll type) {
        for(re ll i=0;i<limit;i++) {if(i<r[i]) swap(a[i],a[r[i]]);}//要迭代序列 
        for(re ll mid=1;mid<limit;mid<<=1) {
            cmplex Wn(cos(Pi/mid),type*sin(Pi/mid));//单位根 
            for(re ll R=mid<<1,j=0;j<limit;j+=R) {//R区间长,枚举到j 
                cmplex w(1,0);//
                for(re ll k=0;k<mid;k++,w=w*Wn) {//左半部分 
                    cmplex x=a[j+k],y=w*a[j+mid+k];
                    a[j+k]=x+y;a[j+mid+k]=x-y;
                }
            }
        }
    }
    int main() {
    //  FR();
        n=read(),m=read();
        for(re ll i=0;i<=n;i++) a[i].x=read();
        for(re ll i=0;i<=m;i++) b[i].x=read();
        while(limit<=n+m) limit<<=1,l++;
        for(re ll i=0;i<limit;i++) {r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}//特殊处理奇数 
        fft(a,1);fft(b,1);
        for(re ll i=0;i<=limit;i++) a[i]=a[i]*b[i];
        fft(a,-1);
        for(re ll i=0;i<n+m;i++) {write((ll)(a[i].x/limit+0.5));putchar(' ');}
        writeln((ll)(a[n+m].x/limit+0.5));
    //  FC();
        return 0;
    }
  • 相关阅读:
    【转】谈谈 JVM 内部锁升级过程
    TCP 和 UDP 协议简介
    《分布式系统原理介绍》读书笔记
    Paxos 协议简单介绍
    Lease 机制和 Quorum 机制
    HBase 学习二(最佳实践).
    HBase 学习一(基础入门).
    Spring 事务介绍
    《MySQL技术内幕:InnoDB存储引擎》读书笔记.
    数据库事务简介.
  • 原文地址:https://www.cnblogs.com/20020723YJX/p/9490659.html
Copyright © 2011-2022 走看看