#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. You-Get,多网站视频下载工具,非常方便

    You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 按Win+R键打开运行,输入cmd,再输入命令 pip install you-get, ...

  2. 管道(Pipe)----计算机进程间通信

    参至他人博客:https://blog.csdn.net/u011583316/article/details/83419805

  3. 3、Java调用C语言(JNA法)

    这个方法挺方便的……(改写“二.Java调用C语言(JNative法)“的例子) 一.访问https://github.com/twall/jna ,下载jna-4.1.0.jar(版本不同名字不同) ...

  4. luogu P5329 [SNOI2019]字符串

    传送门 显然要写一个排序,那只要考虑cmp函数怎么写就行了.第\(i\)个字符串和第 \(j\)个,首先前\(min(i,j)-1\)个字符是相同的,然后就是要比较后缀\(min(i,j)\)和\(m ...

  5. 吴恩达深度学习:2.1Logistic Regression逻辑回归及其损失函数

    1.Logistic Regression是一个二元分类问题 (1)已知输入的特征向量x可能是一张图,你希望把它识别出来,这是不是猫图,你需要一个算法,可以给出预测值,更正式的y是一个概率,当输入特征 ...

  6. SpringBoot_04springDataJPA

    说明:底层使用Hibernate 一.springDataJPA和mybatisPlus的使用区别 第一步: 把mybatisPlus的依赖.配置删除 包括:实体类的注解.引导类的mapperScan ...

  7. 【学习总结】快速上手Linux玩转典型应用-第6章-linux常用命令讲解

    课程目录链接 快速上手Linux玩转典型应用-目录 目录 1. 软件操作命令 2. 服务器硬件资源信息 3. 文件操作命令 4. Linux文本编辑神器vim与其他常用命令 5. 系统用户操作命令 6 ...

  8. vue项目1-pizza点餐系统8-登陆和注册结构

    <template> <!-- 设置行 --> <div class="row mt-3"> <!-- 设置列 --> <di ...

  9. 关于使用iframe的父子页面进行简单的相互传值

    当一个页面使用了iframe作为嵌套时,如何想要将父页面的数据传给iframe子页面,那iframe所指向的呢个子页面是怎么获取呢,又或者子页面的数据要给父页面使用,那么父页面又如何获取子页面的数据呢 ...

  10. HTML第一课(前期知识准备)

    在正式的学习之前,我们先了解一些前端方面的常识. 一.前端是做什么? 如果有认真看过我写的预备程序员不得不知道的事儿这篇文章的同学应该清楚,前端的工作在整个项目开发中处于代码编写阶段,主要是用来做界面 ...