luogu P4245 【模板】任意模数NTT MTT
Code:
#include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 1000000 #define M 32768 #define double long double #define ll long long using namespace std; namespace poly{ const double pi=acos(-1); int rev[maxn],l; struct Cpx{ double x,y; Cpx (double t1=0,double t2=0){x=t1,y=t2;} }; Cpx operator+(Cpx a,Cpx b){ return Cpx(a.x+b.x,a.y+b.y);} Cpx operator-(Cpx a,Cpx b){ return Cpx(a.x-b.x, a.y-b.y); } Cpx operator*(Cpx a,Cpx b){ return Cpx(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x); } void FFT(Cpx *a,int n,int flag){ for(int i=0;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1)); for(int i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]); for(int mid=1;mid<n;mid<<=1){ Cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y; for(int j=0;j<n;j+=(mid<<1)){ Cpx w(1,0); for(int k=0;k<mid;++k) { x=a[j+k],y=w*a[j+mid+k]; a[j+k]=x+y,a[j+mid+k]=x-y, w=w*wn; } } } if(flag==1) return; for(int i=0;i<n;++i) a[i].x=a[i].x/(double)n; } Cpx a[maxn<<1],b[maxn<<1],c[maxn<<1],d[maxn<<1]; Cpx e[maxn<<1],g[maxn<<1],f[maxn<<1],h[maxn<<1]; int ans[maxn]; void MTT(int n,int m,int *F,int *G,int p){ n+=m,l=0; for(m=1;m<=n;m<<=1) ++l; for(int i=0;i<n;++i) { a[i].x=F[i]/M,b[i].x=F[i]%M; c[i].x=G[i]/M,d[i].x=G[i]%M; } FFT(a,m,1),FFT(b,m,1),FFT(c,m,1),FFT(d,m,1); for(int i=0;i<m;++i){ e[i]=a[i]*c[i],f[i]=a[i]*d[i]; g[i]=b[i]*c[i],h[i]=b[i]*d[i]; } FFT(e,m,-1),FFT(f,m,-1),FFT(g,m,-1),FFT(h,m,-1); for(int i=0;i<m;++i){ ans[i]=(ll)(e[i].x+0.5)%p*M%p*M%p,ans[i]%=p; ans[i]+=(ll)(f[i].x+0.5)%p*M%p,ans[i]%=p; ans[i]+=(ll)(g[i].x+0.5)%p*M%p,ans[i]%=p; ans[i]+=(ll)(h[i].x+0.5)%p; ans[i]%=p; } } }; int n,m,p; int A[maxn<<1],B[maxn<<1]; int main(){ //setIO("input"); scanf("%d%d%d",&n,&m,&p); for(int i=0;i<=n;++i) scanf("%d",&A[i]); for(int i=0;i<=m;++i) scanf("%d",&B[i]); poly::MTT(n,m,A,B,p); for(int i=0;i<=n+m;++i) printf("%d ",poly::ans[i]); return 0; }
luogu P4245 【模板】任意模数NTT MTT的更多相关文章
- [题解] Luogu P4245 [模板]任意模数NTT
三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...
- 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)
题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...
- 洛谷.4245.[模板]任意模数NTT(MTT/三模数NTT)
题目链接 三模数\(NTT\): 就是多模数\(NTT\)最后\(CRT\)一下...下面两篇讲的都挺明白的. https://blog.csdn.net/kscla/article/details/ ...
- [洛谷P4245]【模板】任意模数NTT
题目大意:给你两个多项式$f(x)$和$g(x)$以及一个模数$p(p\leqslant10^9)$,求$f*g\pmod p$ 题解:任意模数$NTT$,最大的数为$p^2\times\max\{n ...
- MTT:任意模数NTT
MTT:任意模数NTT 概述 有时我们用FFT处理的数据很大,而模数可以分解为\(a\cdot 2^k+1\)的形式.次数用FFT精度不够,用NTT又找不到足够大的模数,于是MTT就应运而生了. MT ...
- 【模板】任意模数NTT
题目描述: luogu 题解: 用$fft$水过(什么$ntt$我不知道). 众所周知,$fft$精度低,$ntt$处理范围小. 所以就有了任意模数ntt神奇$fft$! 意思是这样的.比如我要算$F ...
- 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)
再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...
- 任意模数NTT
任意模数\(NTT\) 众所周知,为了满足单位根的性质,\(NTT\)需要质数模数,而且需要能写成\(a2^{k} + r\)且\(2^k \ge n\) 比较常用的有\(998244353,1004 ...
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...
随机推荐
- 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
这是在复制代码的时候,没有修改路径,但是IDEA没有报错,还会爆出 WARN ework.web.servlet.PageNotFound - No mapping found for HTTP re ...
- PySimpleGUI 的第一个桌面软件
最近学习了python风格的GUI模块,寻思着既然学了,就要学以致用,花了点时间,写了下面这个 简历软件.后面,可以通过接口 获取提交的数据,传到数据库里与网页交互.此软件我已经打包成 exe软件,直 ...
- Codeforces 787A The Monster( 拓展欧几里德 )
链接:传送门 题意:ok 题意略 思路:将问题转化成求 b + a * x = d + c * y,简单拓欧,但是需要注意的是 x >= 0 且 y >= 0 /************* ...
- Linux 基础入门一
操作系统1.简介OS: Operating System,通用目的的软件程序操作系统的内核(kernel): 操作系统其实也是一组程序.这组程序的重点在于管理计算机的所有活动及驱动系统中的所有硬件: ...
- Java生成随机数的三种方式
package cn.zytao.taosir.random; import java.util.Random; public class RandomDemo { private static In ...
- TensorFlow 版本问题
TensorFlow各个版本均可以在GitHub上下载,之前下载配置的是0.5.0版本,运行的时候,出现很多问题,什么模块缺失attribute,函数参数问题等,修改起来让人抓狂,后来索性下载使用0. ...
- ES scroll(ES游标) 解决深分页
ES scroll(ES游标) 解决深分页. Why 当Elasticsearch响应请求时,它必须确定docs的顺序,排列响应结果.如果请求的页数较少(假设每页20个docs), Elasticse ...
- BA-siemens-insight_lenum点
lenum点特性 lenum点有如下特点 如果状态字是自定义的,只能在bacnet / ip的aln层使用 如果想在ms/tp层使用lenum的功能,就必须将system profile中bacnet ...
- C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示. #include<stdio.h> ...
- java 顺序 读写 Properties 配置文件 支持中文 不乱码
java 顺序 读写 Properties 配置文件 ,java默认提供的Properties API 继承hashmap ,不是顺序读写的. 特从网上查资料,顺序读写的代码,如下, import j ...