模板 NTT 快速数论变换
NTT裸模板,没什么好解释的
这种高深算法其实也没那么必要知道原理
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N (1<<17)+10
#define ll long long
using namespace std; ll inv3,invl;
int r[N];
ll A[N],B[N],C[N],mulwn[N],invwn[N];
char s1[N],s2[N];
const ll p=;
ll qpow(ll x,ll y,ll mo){
ll ans=;
while(y){
if(y&) ans=(ans*x)%mo;
x=(x*x)%mo,y>>=;
}return ans;
}
void pre(int len,int l)
{
inv3=qpow(,p-,p),invl=qpow(len,p-,p);
for(int i=;i<len;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
for(ll i=;i<=len;i<<=) mulwn[i]=qpow(,(p-)/i,p);
for(ll i=;i<=len;i<<=) invwn[i]=qpow(mulwn[i],p-,p);
}
void NTT(ll *a,int len,int type)
{
for(int i=;i<len;i++)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int k=;k<=len;k<<=)
{
ll wn=(type>)?mulwn[k]:invwn[k];
int mid=k>>;
for(int i=;i<len;i+=k)
{
ll w=;
for(int j=;j<mid;j++,w=(w*wn)%p)
{
ll t=(w*a[i+j+mid])%p;
a[i+j+mid]=(a[i+j]-t+p)%p;
a[i+j]=(a[i+j]+t)%p;
}
}
}
if(type==-)
for(int i=;i<len;i++)
a[i]=(a[i]*invl)%p;
}
void NTT_main(ll *a,ll *b,ll *c,int len,int l)
{
NTT(a,len,);NTT(b,len,);
for(int i=;i<len;i++) c[i]=(a[i]*b[i])%p;
NTT(c,len,-);
} int main()
{
int n,len=,l=;scanf("%d",&n);
scanf("%s",s1),scanf("%s",s2);
for(int i=;i<n;i++) A[n-i-]=s1[i]-'';
for(int i=;i<n;i++) B[n-i-]=s2[i]-'';
while(len<n+n) len<<=,l++;
pre(len,l);
NTT_main(A,B,C,len,l);
for(int i=;i<len;i++)
if(C[i]>) C[i+]+=C[i]/,C[i]%=;
int j=len;
while(C[j]==) j--;
while(j>-) printf("%lld",C[j]),j--;
puts("");
return ;
}
模板 NTT 快速数论变换的更多相关文章
- NTT 快速数论变换
NTT 先学习FFT 由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换). 建议先完全理解FFT后再学习NTT. 原根 NTT使用与单位根性质相似的原根来代替单位根. ...
- [学习笔记]NTT——快速数论变换
先要学会FFT[学习笔记]FFT——快速傅里叶变换 一.简介 FFT会爆精度.而且浮点数相乘常数比取模还大. 然后NTT横空出世了 虽然单位根是个好东西.但是,我们还有更好的东西 我们先选择一个模数, ...
- Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT
Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...
- 【算法】快速数论变换(NTT)初探
[简介] 快速傅里叶变换(FFT)运用了单位复根的性质减少了运算,但是每个复数系数的实部和虚部是一个余弦和正弦函数,因此系数都是浮点数,而浮点数的运算速度较慢且可能产生误差等精度问题,因此提出了以数论 ...
- 「算法笔记」快速数论变换(NTT)
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...
- 快速傅里叶变换 & 快速数论变换
快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...
- 多项式乘法(FFT)模板 && 快速数论变换(NTT)
具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DF ...
- 模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)
先看看. 通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3.所求的项数还不能超过2的23次方(因为998244353的分解). 感觉没啥用. #incl ...
- 模板 - 数学 - 多项式 - 快速数论变换/NTT
Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bi ...
随机推荐
- Spring Boot project with static content generates 404 when running jar
转自:http://stackoverflow.com/questions/21358403/spring-boot-project-with-static-content-generates-404 ...
- HDU2035 - 人见人爱A^B
求A^B的最后三位数表示的整数. 说明:A^B的含义是"A的B次方" Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=1 ...
- PHP学习总结(3)——PHP入门篇之PHP的echo语句
Echo语句 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来). 如下代码: <?php echo "Hello world!";?> 注意ech ...
- 各项硬件使用剖析(一)---让你一眼就能区分瓶颈是Memory、processor ORdisk!
- Tcl学习之--表达式
l 数值操作数 表达式的操作数一般是整数或实数.整数可能是十进制.二进制,八进制或十六进制. 比方以下同一个整数 335 --> 十进制 0o517 ...
- 微信小程序怎么获取当前页面的url
使用getCurrentPages可以获取当前加载中所有的页面对象的一个数组,数组最后一个就是当前页面. var pages = getCurrentPages() //获取加载的页面 var cur ...
- Line(扩展欧几里得)
题意:本题给出一个直线,推断是否有整数点在这条直线上: 分析:本题最重要的是在给出的直线是不是平行于坐标轴,即A是不是为0或B是不是为0..此外.本题另一点就是C输入之后要取其相反数,才干进行扩展欧几 ...
- 全面具体介绍一个P2P网贷领域的ERP系统的主要功能
一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion ...
- 2016.03.28,英语,《Vocabulary Builder》Unit 07
vis: comes from a Latin verb meaning 'see'. vision: ['vɪʒn] n. 视觉,先见之明,光景,视力,眼力,幻想,影像 vt. 幻想. ; vid- ...
- bzoj3998: [TJOI2015]弦论(SAM+dfs)
3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...