拆系数$FFT$($4$遍$DFT$)
#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;
}
随机推荐
- 【Linux开发】如何更改linux文件的拥有者及用户组(chown和chgrp)
本文整理自: http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/ http://ydlmlh.iteye.c ...
- VS2017使用dotnet命令
添加引用Microsoft.EntityFrameworkCore.Tools 添加引用后提示未找到命令“dotnet ef”向csprog文件添加如下节点 <ItemGroup> < ...
- TestNG+extentReports+log4j2 完善自动化测试框架——美观的报告和保留日志文件
1:导入Maven依赖<dependency> <groupId>com.aventstack</groupId> <artifactId>extent ...
- MySql 性能优化之 Explain
MySQL 之 Explain 输出分析 背景 前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个.可能工作中实 ...
- [转帖]华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz
华为海思Hi1620芯片发布在即 7nm制程ARM架构最高可达3.0GHz https://www.cnbeta.com/articles/tech/850561.htm 中电科旗下的普华软件 支持国 ...
- webpack e6转化成es5 配置方法
方法一: https://www.babeljs.cn/setup#installation 按照babel官方的配置配 方法二: https://www.jianshu.com/p/ce28cedd ...
- HNUSTOJ-1437 无题
1437: 无题 时间限制: 1 Sec 内存限制: 128 MB提交: 268 解决: 45[提交][状态][讨论版] 题目描述 tc在玩一个很无聊的游戏:每一次电脑都会给一个长度不超过10^5 ...
- KMP解决最小循环节问题
# 10035. 「一本通 2.1 练习 1」Power Strings [题目描述] 给定若干个长度 $\le 10^6$ 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的.如 ...
- 生成EXCEL文件是经常需要用到的功能,我们利用一些开源库可以很容易实现这个功能。
方法一:利用excellibrary,http://code.google.com/p/excellibrary/ excellibrary是国人写的开源组件,很容易使用,可惜貌似还不支持.xlsx( ...
- Python 中的Lock与RLock
摘要 由于多线程共享进程的资源和地址空间,因此,在对这些公共资源进行操作时,为了防止这些公共资源出现异常的结果,必须考虑线程的同步和互斥问题. 为什么加锁:1.用于非线程安全, 2.控制一段代码,确保 ...