洛谷P3803 【模板】多项式乘法 [NTT]
多项式乘法
题目描述
给定一个n次多项式F(x),和一个m次多项式G(x)。
请求出F(x)和G(x)的卷积。
输入输出格式
输入格式:
第一行2个正整数n,m。
接下来一行n+1个数字,从低到高表示F(x)的系数。
接下来一行m+1个数字,从低到高表示G(x))的系数。
输出格式:
一行n+m+1个数字,从低到高表示F(x)∗G(x)的系数。
输入输出样例
1 2
1 2
1 2 1
1 4 5 2
说明
保证输入中的系数大于等于 0 且小于等于9。
对于100%的数据: $n, m \leq {10}^6$ , 共计20个数据点,2s。
数据有一定梯度。
空间限制:256MB
分析:
没错,这是一道FFT模板,于是我们愉快地用NTT把它A了。
平常用的较多的都是FFT,但是FFT使用的是复数,需要开double类型,常数会比较大。但有时候我们需要求的都是整型,那么用NTT(快速数论变换)就可以把常数降低很多。具体实现理论和FFT基本无异,不过我们要把单位根换成原根,因为原根也满足单位根的性质,最后就可得到一个结论:$w_n \equiv g^{\frac {p-1} {n}} \pmod p$。具体的理论推荐这位大佬的博客。(吐槽一句,为什么开了O2之后不管是FFT还是NTT都反而更慢了???难道是我的代码写得太优秀???)
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e6+;
const int mod=;
int n,m,lim,r[N];
int G=,Gi=;
ll a[N],b[N];
inline ll read()
{
char ch=getchar();ll num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void Swap(ll &x,ll &y)
{
x^=y,y^=x,x^=y;
}
inline ll power(ll x,ll y)
{
ll ret=;
while(y){
if(y&)ret=(ret*x)%mod;
y>>=;x=(x*x)%mod;}
return ret;
}
inline void ntt(ll *A,int type)
{
for(int i=;i<lim;i++)
if(i<r[i])Swap(A[i],A[r[i]]);
for(int mid=;mid<lim;mid<<=){
ll wn=power((type==)?G:Gi,(mod-)/(mid<<));
for(int j=;j<lim;j+=(mid<<)){
ll w=;
for(int k=;k<mid;w=(w*wn)%mod,k++){
ll x=A[j+k],y=A[mid+j+k]*w%mod;
A[j+k]=(x+y)%mod;
A[mid+j+k]=(x-y+mod)%mod;
}
}
}
}
int main()
{
n=read();m=read();
for(int i=;i<=n;i++)a[i]=(read()+mod)%mod;
for(int i=;i<=m;i++)b[i]=(read()+mod)%mod;
m+=n;n=;
for(lim=;lim<=m;lim<<=)n++;
for(int i=;i<lim;i++)
r[i]=(r[i>>]>>)|((i&)<<(n-));
ntt(a,);ntt(b,);
for(int i=;i<lim;i++)a[i]=(a[i]*b[i])%mod;
ntt(a,-);ll inv=power(lim,mod-);
for(int i=;i<=m;i++)
printf("%lld ",(a[i]*inv)%mod);
return ;
}
洛谷P3803 【模板】多项式乘法 [NTT]的更多相关文章
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.4512.[模板]多项式除法(NTT)
题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...
- 洛谷.4238.[模板]多项式求逆(NTT)
题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...
- 洛谷.4721.[模板]分治FFT(NTT)
题目链接 换一下形式:\[f_i=\sum_{j=0}^{i-1}f_jg_{i-j}\] 然后就是分治FFT模板了\[f_{i,i\in[mid+1,r]}=\sum_{j=l}^{mid}f_jg ...
- 洛谷 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/ ...
- 洛谷 P4512 [模板] 多项式除法
题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...
- 洛谷 P4238 [模板] 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...
- P3803 [模板] 多项式乘法 (FFT)
Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...
随机推荐
- 安装配置hexo icarus主题配置
安装部分配置hexo icarus主题配置 安装icarus 直接下载主题模块放到blog项目 ,blog项目根目录执行 git clone https://github.com/ppoffice/h ...
- Codechef Course Selection
Home » Practice(Hard) » Course Selection Course Selection Problem Code: RINSubmit https://www.codech ...
- 重构改善既有代码设计--重构手法07:Remove Assignments to Parameters (移除对参数的赋值)
代码对一个 参数赋值.以一个临时变量取代该参数的位置. int Discount(int inputVal, int quantity, int yearTodate) { if (input ...
- React-music 全家桶项目
React-Music 全家桶项目 一.简介 该项目是基于React全家桶开发的一个音乐播放器,技术栈采用:Webpack + React + React-redux + React-router + ...
- IO流-LineNumberReader
LineNumberReader继承自BufferedReader,比其多了两个方法,用于设置和获取当前行号, setLineNumber(); getLineNumber();
- 1-spring xml 和 注解 解析过程
spring mvc 入口 DispatcherServlet,类关系图如下所示 DispatcherServlet 就是一个 Servlet,那Servlet 的初始化方法 init()在哪里,通过 ...
- Bootstrap文件上传组件:bootstrap fileinput
为了上传预览pdf与图片特用此插件. 源码以及API地址: bootstrap-fileinput源码:https://github.com/kartik-v/bootstrap-fileinput ...
- Sqlmap与burpsuite动态更新某些参数
有如下注入点: http://localhost/id=1&order_nu=1 情况说明: id为注入点, 每一次注入时, order_nu不能跟上次的一样(假说这个order_nu为一个 ...
- i春秋第二届春秋欢乐赛RSA256writeup
i春秋第二届春秋欢乐赛writeup 下载之后进行解压 发现四个文件 0x01看到题目是RSA的 又看到public.key 所以直接用kali linux的openssl 0x02可以看到e就是E ...
- Django框架<一>
Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sess ...