题目传送门

多项式乘法

题目描述

给定一个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:

1 2
1 2
1 2 1
输出样例#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]的更多相关文章

  1. 洛谷.3803.[模板]多项式乘法(NTT)

    题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...

  2. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

  3. 洛谷.4512.[模板]多项式除法(NTT)

    题目链接 多项式除法 & 取模 很神奇,记录一下. 只是主要部分,更详细的和其它内容看这吧. 给定一个\(n\)次多项式\(A(x)\)和\(m\)次多项式\(D(x)\),求\(deg(Q) ...

  4. 洛谷.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\ ...

  5. 洛谷.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 ...

  6. 洛谷 P4245 [模板]任意模数NTT —— 三模数NTT / 拆系数FFT(MTT)

    题目:https://www.luogu.org/problemnew/show/P4245 用三模数NTT做,需要注意时间和细节: 注意各种地方要取模!传入 upt() 里面的数一定要不超过2倍 m ...

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

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

  8. 洛谷 P4512 [模板] 多项式除法

    题目:https://www.luogu.org/problemnew/show/P4512 看博客:https://www.cnblogs.com/owenyu/p/6724611.html htt ...

  9. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

  10. P3803 [模板] 多项式乘法 (FFT)

    Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...

随机推荐

  1. echart图跟随屏幕自适应变化

    var myChart = echarts.init(document.getElementById('main'),'macarons');// var option = { //...一些配置 / ...

  2. [USACO14MAR] Counting Friends

    题目描述 Farmer John's N cows (2 <= N <= 500) have joined the social network "MooBook". ...

  3. 逆推 Gym 101102J

    题目链接:http://codeforces.com/gym/101102/problem/J 题目大意可以看这个人的:http://www.cnblogs.com/chen9510/p/593362 ...

  4. 【CodeForces】708 C. Centroids 树的重心

    [题目]C. Centroids [题意]给定一棵树,求每个点能否通过 [ 移动一条边使之仍为树 ] 这一操作成为树的重心.n<=4*10^5. [算法]树的重心 [题解]若树存在双重心,则对于 ...

  5. 小程序Openid 获取,服务器 encryptedData 解密 遇到的坑

    获取客户 openId 和 unionId 需要以下步骤(都为必须步骤) 1.从验证从客户端传上来code, 获取sessionKey (需要配合小程序appid ,secret 发送到微信服务器) ...

  6. Function.prototype.bind 简介

    bind可以解决两种问题: 1. 可以改变一个函数的 this 指向 2. 可以实现偏函数等高阶功能 本文暂且讨论第一个功能 USE CASE var foo = { x: 3 } var bar = ...

  7. Automation Testing - Best Practice(书写规范)

    Coding Standards Coding Standards are suggestions that will help us to write automation Scripts code ...

  8. oracle查看表中数据的大小

    通过从视图 user_segments的字段 bytes中找到 select SUM(bytes)/1024/1024 from user_segments where segment_name='E ...

  9. PHP对象1: 创建对象与 $this

    <?php class perl{ public $name; function __construct($name){ echo '一个对象造好了<br/>'; $this-> ...

  10. [003] largest_subarray_with_equal_1&0

    [Description] Given an array with only '1' and '0', find a largest length sub-array which contains e ...