额,其实就是裸的三模数NTT,上一篇已经说过了

哦,还有一个就是对乘起来炸long long的数取模,用long double之类的搞一下就好,精度什么的,,(看出题人心情??)

 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define LL long long
#define N 300005
using namespace std;
inline int ra()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x;
} const int mod=;
const int M[]={,,};
const int G[]={,,};
const LL _M=(LL)M[]*M[]; LL ksm(LL a, int b, int P)
{
LL sum=;
for (;b;b>>=,a=a*a%P)
if (b&) sum=sum*a%P;
return sum;
}
/*LL mul(LL a, LL b, LL p)
{
a%=p; b%=p;
return ((a*b-(LL)((LL)((long double)a/p*b+1e-3)*p))%p+p)%p;
}
const int m1=M[0],m2=M[1],m3=M[2];
const int inv1=ksm(m1%m2,m2-2,m2),inv2=ksm(m2%m1,m1-2,m1),inv12=ksm(_M%m3,m3-2,m3);
int CRT(int a1, int a2, int a3)
{
LL A=(mul((LL)a1*m2%_M,inv2,_M)+mul((LL)a2*m1%_M,inv1,_M))%_M;
LL k=((LL)a3+m3-A%m3)*inv12%m3;
return (k*(_M%mod)+A)%mod;
}*/ inline LL mul(LL a,LL b,LL p){
a%=p; b%=p;
return ((a*b-(LL)((LL)((long double)a/p*b+1e-)*p))%p+p)%p;
} const int m1=M[],m2=M[],m3=M[];
const int inv1=ksm(m1%m2,m2-,m2),inv2=ksm(m2%m1,m1-,m1),inv12=ksm(_M%m3,m3-,m3);
inline int CRT(int a1,int a2,int a3){
LL A=(mul((LL)a1*m2%_M,inv2,_M)+mul((LL)a2*m1%_M,inv1,_M))%_M;
LL k=((LL)a3+m3-A%m3)*inv12%m3;
return (k*(_M%mod)+A)%mod;
}
int rev[N];
struct NTT{
int num,P,G;
int w[][N];
void pre(int _P, int _G, int n)
{
num=n; P=_P; G=_G;
int g=ksm(G,(P-)/num,P);
w[][]=; for (int i=; i<n; i++) w[][i]=(LL)w[][i-]*g%P;
w[][]=; for (int i=; i<n; i++) w[][i]=w[][n-i];
}
void FFT(int *a, int n, int f)
{
for (int i=; i<n; i++) if (i<rev[i]) swap(a[i],a[rev[i]]);
for (int i=; i<n; i<<=)
for (int j=; j<n; j+=(i<<))
for (int k=; k<i; k++)
{
int x=a[j+k],y=(LL)w[f][num/(i<<)*k]*a[i+j+k]%P;
a[j+k]=(x+y)%P; a[i+j+k]=(x-y+P)%P;
}
if (!f) for (int i=,inv=ksm(n,P-,P); i<n; i++) a[i]=(LL)a[i]*inv%P;
}
}ntt[]; int n,m;
int ans[][N];
int a[N],b[N],c[N],d[N]; int main()
{
freopen("annona_squamosa.in","r",stdin); freopen("annona_squamosa.out","w",stdout);
n=ra();
for (int i=; i<n; i++) a[i]=ra();
for (int i=; i<n; i++) b[i]=ra();
for (m=; m<n<<; m<<=);
int L=,x=m>>; while (!(x&)) x>>=,L++;
for (int i=; i<m; i++) rev[i]=(rev[i>>]>>)|((i&)<<L);
// for (m=1;m<=2*(n-1);m<<=1);
// int L=0,x=m; while (x>>=1) L++;
// for (int i=1;i<=m;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
// for (int i=0; i<m; i++) printf("%d ",rev[i]); cout<<endl;
for (int i=; i<; i++) ntt[i].pre(M[i],G[i],m);
for (int i=; i<; i++)
{
memcpy(c,a,sizeof(int)*(m+)); memcpy(d,b,sizeof(int)*(m+));
ntt[i].FFT(c,m,); ntt[i].FFT(d,m,);
for (int j=; j<m; j++) c[j]=(LL)c[j]*d[j]%ntt[i].P;
ntt[i].FFT(c,m,);
for (int j=; j<m; j++) ans[i][j]=c[j];
}
for (int i=; i<n; i++) printf("%d ",CRT(ans[][i],ans[][i],ans[][i]));
return ;
}

最新文章

  1. Centos 上 Tengine安装
  2. java Io流更新文件内容
  3. Unity学习疑问记录之 动作动画忽略timeScale
  4. Adobe After Effects工程使用aep格式来存储
  5. 【Effective Java】11、同步访问共享的可变数据
  6. asp.net(C#)读取word 文档的方法
  7. 基于Selenium2+Java的UI自动化(5) - 执行JavaScript脚本
  8. Linux伙伴系统1
  9. 解决TextView与RadioGroup不对齐的问题
  10. Android Studio导出Jar包
  11. [leetcode-594-Longest Harmonious Subsequence]
  12. springboot scheduled并发配置
  13. 网络编程基础+UDP的实现
  14. EFCore CodeFirst 连接MySql
  15. 洛谷P2050 [NOI2012]美食节
  16. 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率
  17. 10. linux输入子系统/input 设备【转】
  18. Tip: JSP开发模式
  19. icpc2018-焦作-D-几何模拟
  20. [POJ 2689] Prime Distance

热门文章

  1. Fluent_Python_Part4面向对象,10-seq-hacking,序列的修改、散列和切片
  2. JavaScript 种一颗二叉树
  3. SprintBoot学习(一)
  4. Hibernate学习(二)
  5. 什么是函数,干嘛啊,怎么干。一个py程序员的视角.md
  6. Java的进制转换
  7. 「ZJOI2011」最小割
  8. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  9. 设计模式课程 设计模式精讲 3-6 单一职责原则Coding
  10. 软件架构,WEB - REST架构,RESTful API