Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
#define M 32768
#define double long double
#define ll long long
using namespace std;
namespace poly{
    const double pi=acos(-1);
    int rev[maxn],l;
    struct Cpx{
        double x,y;
        Cpx (double t1=0,double t2=0){x=t1,y=t2;}
    };
    Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);}
    Cpx operator-(Cpx a,Cpx b){ return Cpx(a.x-b.x, a.y-b.y); }
    Cpx operator*(Cpx a,Cpx b){ return Cpx(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x); }
    void FFT(Cpx *a,int n,int flag){
        for(int i=0;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
        for(int i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
        for(int mid=1;mid<n;mid<<=1){
            Cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y;
            for(int j=0;j<n;j+=(mid<<1)){
                Cpx w(1,0);
                for(int k=0;k<mid;++k) {
                    x=a[j+k],y=w*a[j+mid+k];
                    a[j+k]=x+y,a[j+mid+k]=x-y, w=w*wn;
                }
            }
        }
        if(flag==1) return;
        for(int i=0;i<n;++i) a[i].x=a[i].x/(double)n;
    }
    Cpx a[maxn<<1],b[maxn<<1],c[maxn<<1],d[maxn<<1];
    Cpx e[maxn<<1],g[maxn<<1],f[maxn<<1],h[maxn<<1];
    int ans[maxn];
    void MTT(int n,int m,int *F,int *G,int p){
        n+=m,l=0;
        for(m=1;m<=n;m<<=1) ++l;
        for(int i=0;i<n;++i) {
            a[i].x=F[i]/M,b[i].x=F[i]%M;
            c[i].x=G[i]/M,d[i].x=G[i]%M;
        }
        FFT(a,m,1),FFT(b,m,1),FFT(c,m,1),FFT(d,m,1);
        for(int i=0;i<m;++i){
            e[i]=a[i]*c[i],f[i]=a[i]*d[i];
            g[i]=b[i]*c[i],h[i]=b[i]*d[i];
        }
        FFT(e,m,-1),FFT(f,m,-1),FFT(g,m,-1),FFT(h,m,-1);
        for(int i=0;i<m;++i){
            ans[i]=(ll)(e[i].x+0.5)%p*M%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(f[i].x+0.5)%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(g[i].x+0.5)%p*M%p,ans[i]%=p;
            ans[i]+=(ll)(h[i].x+0.5)%p;
            ans[i]%=p;
        }
    }
};
int n,m,p;
int A[maxn<<1],B[maxn<<1];
int main(){
    //setIO("input");
    scanf("%d%d%d",&n,&m,&p);
    for(int i=0;i<=n;++i) scanf("%d",&A[i]);
    for(int i=0;i<=m;++i) scanf("%d",&B[i]);
    poly::MTT(n,m,A,B,p);
    for(int i=0;i<=n+m;++i) printf("%d ",poly::ans[i]);
    return 0;
}

  

最新文章

  1. 牛顿法与拟牛顿法学习笔记(五)L-BFGS 算法
  2. 调用WCF Data Service的几点Tips
  3. 易企秀 we+ Maka 兔展 四大H5页面制作工具
  4. [Effective C++ --022]将成员变量声明为private
  5. Transposed Matrix
  6. POJ3268 Silver Cow Party(dijkstra+矩阵转置)
  7. javascript实现当前页导航激活
  8. HTML 5 drag and drop 简介
  9. 第25周五迷茫定位&amp;转行理论建议
  10. Qt使用中碰到的问题
  11. JS打开摄像头并截图上传
  12. V8 内存控制
  13. C++STL模板库序列容器之vector
  14. 开始PYTHON之路
  15. Oracle imp exp 导入导出 执行脚本
  16. 29.Hibernate-二级缓存和session管理.md
  17. 课程三(Structuring Machine Learning Projects),第一周(ML strategy(1)) —— 0.Learning Goals
  18. day32(表单校验js和jquery表单校验)
  19. 【转载】Qt Creator 添加自定义注释
  20. 微服务Kong(十)——负载均衡参考

热门文章

  1. luogu P2634 [国家集训队]聪聪可可 点分治
  2. BZOJ1150 [CTSC2007] 数据备份Backup 贪心_堆_神题
  3. 洛谷P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver 性质分析
  4. Java 习惯用法总结
  5. 40 最小的K个数(时间效率)
  6. nyoj27-水池数目【DFS】
  7. [洛谷 P1967] 货车运输 (最大生成树 lca)
  8. vncserve安装与使用
  9. PHP学习总结(8)——PHP入门篇之WAMPServer集成环境安装和配置
  10. dtd对xml没有起到约束作用