题目描述

给定 2 个多项式 F(x),G(x) ,请求出 F(x)∗G(x) 。

系数对 p 取模,且不保证 p 可以分解成 p=a⋅2^k+1 之形式。

输入输出格式

输入格式:

输入共 3 行。
第一行 3 个整数 n,m,p ,分别表示 F(x),G(x) 的次数以及模数 p 。
第二行为 n+1 个整数, 第 i 个整数 a_i 表示 F(x) 的 i-1 次项的系数。
第三行为 m+1 个整数, 第 i 个整数 b_i 表示 G(x) 的 i-1 次项的系数。

输出格式:

输出 n+m+1 个整数, 第 i 个整数 c_i 表示 F(x) * G(x) 的 i-1 次项的系数。

输入输出样例

输入样例#1:

5 8 28
19 32 0 182 99 95
77 54 15 3 98 66 21 20 38

输出样例#1:

7 18 25 19 5 13 12 2 9 22 5 27 6 26

说明

1≤n≤105,0≤ai,bi≤109,2≤p≤109+9,1≤n≤1051≤n≤105,0≤ai,bi≤109,2≤p≤109+9,1≤n≤1051 \leq n \leq 10^5, 0 \leq a_i, b_i \leq 10^9, 2 \leq p \leq 10^9 + 9,1≤n≤10^ 5

Solution

  • 第一道拆系数FFT,被神奇错误卡了很久很久……

  • 把系数拆成 kM+bkM+bkM+b ,这样乘就不会有精度问题了。

  • 然而问题是这个M要取2的整数次幂(即 M=215M=215M=2^{15}),不然会有迷之错误。

  • 有高手知道可以指导我一下……

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
typedef long long LL;
const int N=1e5+5,pp=1<<15;
const double Pi=acos(-1.0);
struct comp
{double r,i;comp(){}comp(double rr,double ii){r=rr,i=ii;}friend comp operator +(comp x,comp y){return comp(x.r+y.r,x.i+y.i);}friend comp operator -(comp x,comp y){return comp(x.r-y.r,x.i-y.i);}friend comp operator *(comp x,comp y){return comp(x.r*y.r-x.i*y.i,x.r*y.i+x.i*y.r);}
};
int n,m,p,len;
int rev[N<<2],f[N<<1];
comp a1[N<<2],b1[N<<2],a2[N<<2],b2[N<<2];
comp c1[N<<2],c2[N<<2],c3[N<<2],w[N<<2];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48),ch=getchar();return w?-X:X;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline void FFT(comp *y,int ff)
{for(int i=0;i<len;i++)if(i<rev[i]) swap(y[i],y[rev[i]]);for(int h=2;h<=len;h<<=1)for(int i=0,mid=h/2,num=len/h;i<len;i+=h){for(int k=i,cnt=0;k<i+mid;k++,cnt++){comp u=y[k],t=w[ff>0?num*cnt:len-num*cnt]*y[k+mid];y[k]=u+t;y[k+mid]=u-t;}}if(ff==-1) for(int i=0;i<len;i++) y[i].r/=len;
}
int main()
{n=read()+1,m=read()+1,p=read();for(int i=0;i<n;i++){int x=read();a1[i].r=x/pp;b1[i].r=x%pp;}for(int i=0;i<m;i++){int x=read();a2[i].r=x/pp;b2[i].r=x%pp;}int l=0;for(len=1;len<n+m;len<<=1) l++;for(int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|(i&1)<<l-1;for(int i=0;i<=len;i++) w[i]=comp(cos(2*Pi*i/len),sin(2*Pi*i/len));FFT(a1,1),FFT(b1,1);FFT(a2,1),FFT(b2,1);for(int i=0;i<len;i++){c1[i]=a1[i]*a2[i];c2[i]=a1[i]*b2[i]+a2[i]*b1[i];c3[i]=b1[i]*b2[i];}FFT(c1,-1),FFT(c2,-1),FFT(c3,-1);for(int i=0;i<n+m-1;i++){f[i]=(LL)(c1[i].r+0.5)%p*pp%p*pp%p;f[i]=(f[i]+(LL)(c2[i].r+0.5)%p*pp%p)%p;f[i]=(f[i]+(LL)(c3[i].r+0.5)%p)%p;}for(int i=0;i<n+m-1;i++) write(f[i]),putchar(' ');return 0;
}

洛谷 P4245 【模板】MTT相关推荐

  1. 洛谷 P4245 【模板】任意模数NTT

    洛谷 P4245 [模板]任意模数NTT 贴个板子,4次DFT. Code #include<cstdio> #include<algorithm> #include<c ...

  2. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  3. 洛谷·【模板】点分树 | 震波【including 点分树

    初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...

  4. 洛谷P4245:【模板】MTT (CRT+三模数NTT)

    题目传送门:https://www.luogu.org/problemnew/show/P4245 题目分析:一道任意模数多项式乘法的模板题.可以写拆项+FFT,或者三模数NTT.我暂时只写了后者. ...

  5. 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)

    题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...

  6. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  7. 强连通分量:洛谷P3387 模板:缩点

    传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...

  8. 【后缀数组】洛谷P3809模板题

    题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...

  9. 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)

    https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...

最新文章

  1. 西南交大量子计算机,交大量子光电实验室
  2. pythonselenium实战 excel读取和写入_Python3.6+selenium2.53.6自动化测试_读取excel文件的方法...
  3. 结构控制Switch Case
  4. pyx文件 生成pyd 文件用于 cython调用
  5. 新发传染病临床案例研究 Emerging Infectious Diseases. Clinical Case Studies
  6. gh0st源码分析与远控的编写(三)
  7. 恢复html的初始选定状态,Adobe Photoshop
  8. 根据实例详解Java中的反射机制
  9. flex 底部固定_小猿圈网站页面底部固定的方法
  10. linux内核网络基础,linux网络内核基础.doc
  11. ncm 网络_江森楼宇自控网络控制模块NCM优势详解
  12. Debian 9.6.0 + OpenMediaVault 4.x : 实机安装前的虚拟机试验
  13. Java语言实现简单FTP软件------FTP软件远程窗口的实现(六)
  14. 张雨石:关于深度学习中的dropout的两种理解
  15. [C语言]切比雪夫多项式,并写入到文件中
  16. 播放html5视频黑屏,播放视频黑屏 · Issue #91 · surmon-china/vue-video-player · GitHub
  17. docker---dockerfile 编写优化
  18. ios-自建网页在浏览器安装ipa包
  19. 60分钟教你上手PyTorch + 迁移学习
  20. 红色警戒在win10下运行办法

热门文章

  1. 64位系统matlab上安装libsvm
  2. 【笔记】基于低空无人机影像和 YOLOv3 实现棉田杂草检测
  3. 【记录】一段不知结果如何的“互联网+”比赛心路历程
  4. [云炬创业管理笔记]第二章测试6
  5. 科大星云诗社动态20210216
  6. [2dPIC调试笔记]初始化变量1014(2)
  7. 云炬Android开发教程 Android studio的详细安装步骤
  8. java中属于常量_java中的常量和属性
  9. matlab 读取含有文本的txt
  10. 利用注入写Webshell(sql-lab第七关)