传送门

今天学习nttnttntt。

其实递归方法和fftfftfft是完全相同的。

只不过fftfftfft的单位根用的是复数中的东西,而nttnttntt用的是数论里面有相同性质的原根。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ans=0;
	 char ch=getchar();
	 while(!isdigit(ch))ch=getchar();
	 while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	 return ans;
}
typedef long long ll;
const int mod=998244353,N=4e5+5;
int pos[N],n,m,a[N],b[N],lim=1,tim=0;
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline void ntt(int a[],int type){
	for(int i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
	int mult=(mod-1)>>1,typ=type==1?3:(mod+1)/3;
	for(int wn,mid=1;mid<lim;mid<<=1,mult>>=1){
		wn=ksm(typ,mult);
		for(int j=0,len=mid<<1;j<lim;j+=len){
			int w=1;
			for(int k=0;k<mid;++k,w=(ll)w*wn%mod){
				int a0=a[j+k],a1=(ll)a[j+k+mid]*w%mod;
				a[j+k]=(a0+a1)%mod,a[j+k+mid]=(a0-a1+mod)%mod;
			}
		}
	}
}
int main(){
	n=read(),m=read();
	for(int i=0;i<=n;++i)a[i]=read();
	for(int i=0;i<=m;++i)b[i]=read();
	while(lim<=n+m)lim<<=1,++tim;
	for(int i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
	ntt(a,1),ntt(b,1);
	for(int i=0;i<lim;++i)a[i]=(ll)a[i]*b[i]%mod;
	ntt(a,-1);
	int inv=ksm(lim,mod-2);
	for(int i=0;i<=n+m;++i)printf("%d ",(ll)a[i]*inv%mod);
	return 0;
}

2018.11.14 uoj#34. 多项式乘法(ntt)的更多相关文章

  1. 2018.11.14 uoj#34. 多项式乘法(fft)

    传送门 NOIpNOIpNOIp爆炸不能阻止我搞oioioi的决心 信息技术课进行一点康复训练. fftfftfft板题. 代码: #include<bits/stdc++.h> usin ...

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

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

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

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

  4. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  5. ●UOJ 34 多项式乘法

    题链: http://uoj.ac/problem/34 题解: FFT入门题. (终于接触到迷一样的FFT了) 初学者在对复数和单位根有简单了解的基础上,可以直接看<再探快速傅里叶变换> ...

  6. 【刷题】UOJ #34 多项式乘法

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

  7. UOJ 34 多项式乘法 FFT 模板

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

  8. UOJ 34: 多项式乘法(FFT模板题)

    关于FFT 这个博客的讲解超级棒 http://blog.miskcoo.com/2015/04/polynomial-multiplication-and-fast-fourier-transfor ...

  9. [UOJ 0034] 多项式乘法

    #34. 多项式乘法 统计 描述 提交 自定义测试 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 nn 和 mm,分别表示两个多项式的次数. 第二行 n+1n+ ...

随机推荐

  1. cisco 3850 GBIC报错处理

    今天有用户cisco 3850插入多模千兆光模块后报错日志如下: *Oct 18 13:48:54: %PLATFORM_PM-6-MODULE_ERRDISABLE:The inserted SFP ...

  2. 【网络编程三】网络通信之多进程(线程)实现TCP通信(一)

    [多进程] [多线程] /************************************************************************* > File sum ...

  3. C盘文件过大,C盘空间莫名丢失,pagefile.sys文件

    设置显示隐藏文件和受保护的系统文件后此文件会显示pagefile.sys这个是window的页面文件,作为系统的虚拟内存使用,和你的物理内存一样大,你内存已经很大了,不用开虚拟内存了.在系统高级属性下 ...

  4. swift - 快速代码块 - 创建 tableview等一些控件 基本属性

    1.创建tableview private lazy var cellId = "cellId" fileprivate lazy var tv : UITableView = { ...

  5. android的Afinal框架下的数据库更新

    项目需要,版本升级时给表添加了一些新的字段,发现出现异常. 解决方法:监听数据库的版本号,更新数据库. 创建FinalDb对象时使用如下的构造函数,监听版本号的变化: db = FinalDb.cre ...

  6. go语言中的坑

    package main; import ( "fmt" "time" "sync" ) //修改slice的坑 func add(s [] ...

  7. 前端基础之JavaScript day51

    前端基础之JavaScript   JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...

  8. Android开发之炫酷MD风格

    文章转自:一点点征服的 http://www.cnblogs.com/ldq2016/p/5217590.html 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...

  9. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...

  10. 如何通过class文件来查看java的版本

    我们知道class文件是通过javac编译生成的,如果我们想知道是java的那个版本生成的,该怎么做? 很简单,Linux下只要使用od命令,如下: 前四个字节为固定的cafe babe,接下来的四个 ...