洛谷 P4245 【模板】MTT
题目描述
给定 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相关推荐
- 洛谷 P4245 【模板】任意模数NTT
洛谷 P4245 [模板]任意模数NTT 贴个板子,4次DFT. Code #include<cstdio> #include<algorithm> #include<c ...
- 专题·树链剖分【including 洛谷·【模板】树链剖分
初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...
- 洛谷·【模板】点分树 | 震波【including 点分树
初见安-这里是传送门:洛谷P6329 [模板]点分树 | 震波 一.点分树 其实你会点分治的话,点分树就是把点分治时的重心提出来重新连城一棵树. 比如当前点是u,求出子树v的重心root后将root与 ...
- 洛谷P4245:【模板】MTT (CRT+三模数NTT)
题目传送门:https://www.luogu.org/problemnew/show/P4245 题目分析:一道任意模数多项式乘法的模板题.可以写拆项+FFT,或者三模数NTT.我暂时只写了后者. ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- 洛谷.4897.[模板]最小割树(Dinic)
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
- 强连通分量:洛谷P3387 模板:缩点
传送门 顾名思义,模板awa #include <cstdio> #include <cstring> #include <cmath> #include < ...
- 【后缀数组】洛谷P3809模板题
题目背景 这是一道模板题. 题目描述 读入一个长度为 n n n 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置. ...
- 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)
https://www.luogu.com.cn/problem/P1919 题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a ...
最新文章
- 西南交大量子计算机,交大量子光电实验室
- pythonselenium实战 excel读取和写入_Python3.6+selenium2.53.6自动化测试_读取excel文件的方法...
- 结构控制Switch Case
- pyx文件 生成pyd 文件用于 cython调用
- 新发传染病临床案例研究 Emerging Infectious Diseases. Clinical Case Studies
- gh0st源码分析与远控的编写(三)
- 恢复html的初始选定状态,Adobe Photoshop
- 根据实例详解Java中的反射机制
- flex 底部固定_小猿圈网站页面底部固定的方法
- linux内核网络基础,linux网络内核基础.doc
- ncm 网络_江森楼宇自控网络控制模块NCM优势详解
- Debian 9.6.0 + OpenMediaVault 4.x : 实机安装前的虚拟机试验
- Java语言实现简单FTP软件------FTP软件远程窗口的实现(六)
- 张雨石:关于深度学习中的dropout的两种理解
- [C语言]切比雪夫多项式,并写入到文件中
- 播放html5视频黑屏,播放视频黑屏 · Issue #91 · surmon-china/vue-video-player · GitHub
- docker---dockerfile 编写优化
- ios-自建网页在浏览器安装ipa包
- 60分钟教你上手PyTorch + 迁移学习
- 红色警戒在win10下运行办法
热门文章
- 64位系统matlab上安装libsvm
- 【笔记】基于低空无人机影像和 YOLOv3 实现棉田杂草检测
- 【记录】一段不知结果如何的“互联网+”比赛心路历程
- [云炬创业管理笔记]第二章测试6
- 科大星云诗社动态20210216
- [2dPIC调试笔记]初始化变量1014(2)
- 云炬Android开发教程 Android studio的详细安装步骤
- java中属于常量_java中的常量和属性
- matlab 读取含有文本的txt
- 利用注入写Webshell(sql-lab第七关)