题目传送门

多项式乘法

题目描述

给定一个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. 【Java】将字符串转化为整数

    前几天面试遇到这个问题:在Java中如何将字符串转化为整数,当时too young too naive,随便回答了一下.今天跑去看Java源码中paresInt函数的写法,Oh my god!其实不看 ...

  2. Android 菜单和上下文演示

    在Action添加个TextView控件(上下文演示用); package com.example.test; import android.app.Activity;import android.o ...

  3. spring bean初始化及销毁你必须要掌握的回调方法

    spring bean在初始化和销毁的时候我们可以触发一些自定义的回调操作. 初始化的时候实现的方法 1.通过java提供的@PostConstruct注解: 2.通过实现spring提供的Initi ...

  4. 常用的20个强大的 Sublime Text 插件

    作为一个开发者你不可能没听说过 Sublime Text.不过你没听说过也没关系,下面让你明白. Sublime Text是一款非常精巧的文本编辑器,适合编写代码.做笔记.写文章.它用户界面十分整洁, ...

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

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

  6. 【leetcode 简单】第五十题 位1的个数

    编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 : 输入: 11 输出: 3 解释: 整数 11 的二进制表示为 00000000000 ...

  7. HDU 1256 画8 (找规律)

    题目链接 Problem Description 谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发.   Input 输入的第一行为一个整数N,表示后面有N组数据. 每组数据中 ...

  8. Traffic-Server配置(待补充和更新)

    Server 5.3.2 测试1.裸盘:remap.configmap http://192.168.227.131 http://192.168.227.131:8080 #traffic_serv ...

  9. wordpress 模板制作之一

    WP模板工作原理图:

  10. 我的Apache又挂了之apache错误:server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'

    表示物理机装Apache然后有时候关机会忘了关闭Apache然后长此以往会导致各种Apache起不来的缘故,上一次已经出现过一次.今天又出现了 再次记录一下解决的方法. 1.查看错误日志 /var/l ...