本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:UOJ34

正解:$NTT$

解题报告:

  $NTT$是用来解决需要取模的一类多项式乘法问题。

  如果要用$NTT$的话,对模数$p$是有要求的:模数要能写成$c*2^k+1$的形式,而且$2^k>n$;

  同时,模数必须要有原根,原根$g$满足的性质是:$g^1,g^2…g^{p-1}$是在模$p$意义下的一个$1$到$p-1$的一个排列。

  回忆一下$FFT$的步骤,中间需要用到单位复数根$w_n$来实现点值表示法,在这里可以直接用$g$的次幂来代替单位复数根,即令$g_n=w_n$,那么$g_n$$=$$g^{\frac{p-1}{n}}$。

  其余的做法与$FFT$完全类似。

  只是需要注意的是,$FFT$最后插值回去的时候,是取了个反,也就是加了个负号。

  把单位复数根画出来,不难发现,是对称的,取了负号之后其实也就是颠倒了顺序,所以$NTT$的最后需要$reverse$一下。

  注意$0$不用$reverse$,可以认为$0$就是对称轴所以无需考虑。

  常用$NTT$模数:

  $998244353$$=$$119*2^{23}+1$,原根为$3$;

  $1004535809$$=$$479*2^{21}+1$,原根为$3$。

  $4179340454199820288$$=$$29*2^{57}+1$,原根为$3$。

  模板保存:

//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <bitset>
using namespace std;
typedef long long LL;
const int mod = 998244353;//119*2^23+1
const int MAXN = 300011;
const int G = 3;
int n,m,L,R[MAXN],a[MAXN],b[MAXN]; inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline LL fast_pow(LL x,LL y){
LL r=1;
while(y>0) {
if(y&1) r*=x,r%=mod;
x*=x; x%=mod;
y>>=1;
}
return r;
} inline void NTT(int *a,int n,int f){
for(int i=0;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);
for(int i=1;i<n;i<<=1) {
LL gn=fast_pow(G,(mod-1)/(i<<1)),x,t;
for(int j=0;j<n;j+=(i<<1)) {
LL g=1;
for(int k=0;k<i;k++,g=1LL*g*gn%mod) {
x=a[j+k]; t=1LL*a[j+i+k]*g%mod;
a[j+k]=(x+t)%mod;
a[j+i+k]=(x-t+mod)%mod;
}
}
}
if(f==1) return ;
reverse(a+1,a+n); int ni=fast_pow(n,mod-2);
for(int i=0;i<=n;i++) a[i]=1LL*a[i]*ni%mod;
} inline void work(){
n=getint(); m=getint();
for(int i=0;i<=n;i++) a[i]=getint();
for(int i=0;i<=m;i++) b[i]=getint();
m+=n; for(n=1;n<=m;n<<=1) L++;
for(int i=0;i<n;i++) R[i]=(R[i>>1]>>1) | ((i&1) << (L-1));
NTT(a,n,1); NTT(b,n,1);
for(int i=0;i<=n;i++) a[i]=1LL*a[i]*b[i]%mod;
NTT(a,n,-1);
for(int i=0;i<=m;i++) printf("%d ",a[i]);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("NTT.in","r",stdin);
freopen("NTT.out","w",stdout);
#endif
work();
return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

UOJ34 多项式乘法(NTT)的更多相关文章

  1. 洛谷P3803 【模板】多项式乘法 [NTT]

    题目传送门 多项式乘法 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字, ...

  2. UOJ#34. 多项式乘法(NTT)

    这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项 ...

  3. UOJ34 多项式乘法

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

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

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

  5. UOJ 34 多项式乘法 ——NTT

    [题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...

  6. 【模板】多项式乘法 NTT

    相对来说是封装好的,可以当模板来用. #include <bits/stdc++.h> #define maxn 5000000 #define G 3 #define ll long l ...

  7. UOJ34 多项式乘法(非递归版)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. 【Uoj34】多项式乘法(NTT,FFT)

    [Uoj34]多项式乘法(NTT,FFT) 题面 uoj 题解 首先多项式乘法用\(FFT\)是一个很久很久以前就写过的东西 直接贴一下代码吧.. #include<iostream> # ...

  9. 【uoj34】 多项式乘法

    http://uoj.ac/problem/34 (题目链接) 题意 求两个多项式的乘积 Solution 挂个FFT板子. 细节 FFT因为要满足$n$是$2$的幂,所以注意数组大小. 代码 // ...

随机推荐

  1. Django资源汇总(转)

    Django 我和Django¶ 我使用python的很大一部分原因就是django.虽然在以前也用过python,不过始终没有什么特别的感觉.然后接触到了django.可以说django非常对我的胃 ...

  2. webpack无法通过 IP 地址访问 localhost 解决方案

    解决方案: 在config里面的index.js里面的module.exports下面的dev下面的host:'localhost' 改为 host:'0.0.0.0',就可以访问啦!

  3. python和shell之间变量的相互调用

    python -> shell: 1.环境变量 2.字符串连接 3.通过管道 import os var=’123’ os.popen(’wc -c’, ’w’).write(var) 4.通过 ...

  4. nodejs获取参数的方法

    1 获取get的querystring参数 GET /test?name=fred&tel=0926xxx572 let aa = req.param("name"); l ...

  5. FindBugs——帮助查找隐藏的bug

    FindBugs 1.什么是FindBugs FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序 ...

  6. 『HTML5挑战经典』是英雄就下100层-开源讲座(二)危险!英雄

    本篇为<『HTML5挑战经典』是英雄就下100层-开源讲座>第二篇,需要用到开源引擎lufylegend,可以到这里下载: 下载地址:http://lufylegend.googlecod ...

  7. django高级之爬虫基础

    目录: 爬虫原理 requests模块 beautifulsoup模块 爬虫自动登陆示例 一.爬虫原理 Python非常适合用来开发网页爬虫,理由如下:1.抓取网页本身的接口相比与其他静态编程语言,如 ...

  8. 斯坦福第二课:单变量线性回归(Linear Regression with One Variable)

    二.单变量线性回归(Linear Regression with One Variable) 2.1  模型表示 2.2  代价函数 2.3  代价函数的直观理解 I 2.4  代价函数的直观理解 I ...

  9. Python(^^^^^小技巧^^^^^——不定期更新)

    偶然想到的小技巧 ''' 交互中对传入函数的参数的数目进行检测 ''' def func(a,b,c): print(a,b,c) s=input(">>>>:&qu ...

  10. xshell连接centos虚拟机

    打开centos终端,输入ifconfig 如果没有这条命令可以输入ip address en什么什么的表示设备名称 inet后面跟着的就是ip地址 复制ip地址,打开xshell,新建,在主机中输入 ...