#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>
#define rin(i,a,b) for(int i=(a);i<=(b);i++)
#define rec(i,a,b) for(int i=(a);i>=(b);i--)
#define trav(i,a) for(int i=head[(a)];i;i=e[i].nxt)
using std::cin;
using std::cout;
using std::endl;
typedef long long LL; inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x;
} const int MAXN=100005;
const int MAXLEN=270005;
const double pi=std::acos(-1);
int n,m;LL MOD;
int len,rev[MAXLEN];
int a[MAXN],b[MAXN];
struct Complex{
double real,imag;
inline friend Complex operator + (Complex x,Complex y){
return (Complex){x.real+y.real,x.imag+y.imag};
}
inline friend Complex operator - (Complex x,Complex y){
return (Complex){x.real-y.real,x.imag-y.imag};
}
inline friend Complex operator * (Complex x,Complex y){
return (Complex){x.real*y.real-x.imag*y.imag,x.real*y.imag+x.imag*y.real};
}
};
Complex w[MAXLEN];
Complex A[MAXLEN],B[MAXLEN],E[MAXLEN];
Complex AA[MAXLEN],BB[MAXLEN],CC[MAXLEN],DD[MAXLEN]; inline void fft(Complex *c,int dft){
rin(i,0,n-1) if(i<rev[i])
std::swap(c[i],c[rev[i]]);
for(int mid=1;mid<n;mid<<=1){
int r=(mid<<1),d=dft*(n/r);
for(int l=0;l<n;l+=r){
int now=0;
for(int i=0;i<mid;i++){
Complex x=c[l+i],y=c[l+mid+i]*w[now];
c[l+i]=x+y;
c[l+mid+i]=x-y;
now+=d;
if(now<0) now+=n;
}
}
}
if(dft<0) rin(i,0,n-1)
c[i].real/=n;
} int main(){
n=read(),m=read(),MOD=read();
rin(i,0,n){
a[i]=read();
A[i].real=(a[i]>>15);
A[i].imag=(a[i]&32767);
}
rin(i,0,m){
b[i]=read();
B[i].real=(b[i]>>15);
B[i].imag=(b[i]&32767);
}
int nn=n,mm=m;
m+=n;
for(n=1;n<=m;n<<=1) len++;
rin(i,0,n-1) w[i]=(Complex){std::cos(2*pi*i/n),std::sin(2*pi*i/n)};
rin(i,1,n-1) rev[i]=((rev[i>>1]>>1)|((i&1)<<(len-1)));
fft(A,1);
fft(B,1);
rin(i,0,n-1){
int ii=(n-i)%n;
AA[i]=(Complex){(A[i].real+A[ii].real)/2,(A[i].imag-A[ii].imag)/2};
BB[i]=(Complex){(A[i].imag+A[ii].imag)/2,(A[ii].real-A[i].real)/2};
CC[i]=(Complex){(B[i].real+B[ii].real)/2,(B[i].imag-B[ii].imag)/2};
DD[i]=(Complex){(B[i].imag+B[ii].imag)/2,(B[ii].real-B[i].real)/2};
}
rin(i,0,n-1){
E[i]=AA[i]*DD[i]+BB[i]*CC[i];
A[i]=AA[i]*CC[i]+BB[i]*DD[i]*(Complex){0,1};
}
fft(A,-1);
fft(E,-1);
std::swap(n,nn);
std::swap(m,mm);
rin(i,0,n+m) printf("%lld ",((((LL)(A[i].real+0.5)%MOD)<<30)%MOD+(((LL)(E[i].real+0.5)%MOD)<<15)%MOD+(LL)(A[i].imag/nn+0.5))%MOD);
printf("\n");
return 0;
}

随机推荐

  1. xmake新增对Cuda代码编译支持

    最近研究了下NVIDIA Cuda Toolkit的编译环境,并且在xmake 2.1.10开发版中,新增了对cuda编译环境的支持,可以直接编译*.cu代码. 关于Cuda Toolkit相关说明以 ...

  2. Java常用的日志框架

    1.Java常用日志框架对比 https://www.jianshu.com/p/bbbdcb30bba8 2.Log4j,Log4j2,Logback日志框架性能对比 https://bbs.hua ...

  3. Mysql函数----控制流函数介绍

    MySQL有4个函数用来进行条件操作的,可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台.   MySQL控制流函数: 1.CASE WHEN[test1] THEN [re ...

  4. CentOS7 源进源出

    echo 200 ct >> /etc/iproute2/rt_tablesecho 201 cu >> /etc/iproute2/rt_tables ip route ad ...

  5. MapReduce计算模型二

    之前写过关于Hadoop方面的MapReduce框架的文章MapReduce框架Hadoop应用(一) 介绍了MapReduce的模型和Hadoop下的MapReduce框架,此文章将进一步介绍map ...

  6. 思维体操: HDU1287破译密码

    破译密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. 用Java构建一个简单的WebSocket聊天室

    前言 首先对于一个简单的聊天室,大家应该都有一定的概念了,这里我们省略用户模块的讲解,而是单纯的先说说聊天室的几个功能:自我对话.好友交流.群聊.离线消息等. 今天我们要做的demo就能帮我们做到这一 ...

  8. SharePoint自己定义程序页面部署 不用重新启动IIS

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/dz45693/article/details/30840255 SharePoint的部署方式默认是 ...

  9. Set中如何区分重复元素

    Set接口常用实现类:HashSet和TreeSet HashSet区分重复元素: 先使用hashcode方法判断已经存在HashSet中元素的hashcode值和将要加入元素hashcode值是否相 ...

  10. Linux下配置JDK环境

    安装前需要查询Linux中是否已经存在jdk 如果存在,将存在的jdk删除 在/etc/profile中添加以下 JAVA_HOME为jdk的安装目录 PATH为jdk可执行文件的目录 使用sourc ...