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 快速数论变换的更多相关文章

  1. NTT 快速数论变换

    NTT 先学习FFT 由于FFT是使用复数运算,精度并不好,而且也无法取模,所以有了NTT(快速数论变换). 建议先完全理解FFT后再学习NTT. 原根 NTT使用与单位根性质相似的原根来代替单位根. ...

  2. [学习笔记]NTT——快速数论变换

    先要学会FFT[学习笔记]FFT——快速傅里叶变换 一.简介 FFT会爆精度.而且浮点数相乘常数比取模还大. 然后NTT横空出世了 虽然单位根是个好东西.但是,我们还有更好的东西 我们先选择一个模数, ...

  3. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  4. 【算法】快速数论变换(NTT)初探

    [简介] 快速傅里叶变换(FFT)运用了单位复根的性质减少了运算,但是每个复数系数的实部和虚部是一个余弦和正弦函数,因此系数都是浮点数,而浮点数的运算速度较慢且可能产生误差等精度问题,因此提出了以数论 ...

  5. 「算法笔记」快速数论变换(NTT)

    一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...

  6. 快速傅里叶变换 & 快速数论变换

    快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...

  7. 多项式乘法(FFT)模板 && 快速数论变换(NTT)

    具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DF ...

  8. 模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)

    先看看. 通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3.所求的项数还不能超过2的23次方(因为998244353的分解). 感觉没啥用. #incl ...

  9. 模板 - 数学 - 多项式 - 快速数论变换/NTT

    Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bi ...

随机推荐

  1. Spring Boot project with static content generates 404 when running jar

    转自:http://stackoverflow.com/questions/21358403/spring-boot-project-with-static-content-generates-404 ...

  2. HDU2035 - 人见人爱A^B

    求A^B的最后三位数表示的整数.  说明:A^B的含义是"A的B次方" Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=1 ...

  3. PHP学习总结(3)——PHP入门篇之PHP的echo语句

    Echo语句 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来). 如下代码: <?php echo "Hello world!";?> 注意ech ...

  4. 各项硬件使用剖析(一)---让你一眼就能区分瓶颈是Memory、processor ORdisk!

      

  5. Tcl学习之--表达式

    l 数值操作数 表达式的操作数一般是整数或实数.整数可能是十进制.二进制,八进制或十六进制. 比方以下同一个整数 335               --> 十进制 0o517         ...

  6. 微信小程序怎么获取当前页面的url

    使用getCurrentPages可以获取当前加载中所有的页面对象的一个数组,数组最后一个就是当前页面. var pages = getCurrentPages() //获取加载的页面 var cur ...

  7. Line(扩展欧几里得)

    题意:本题给出一个直线,推断是否有整数点在这条直线上: 分析:本题最重要的是在给出的直线是不是平行于坐标轴,即A是不是为0或B是不是为0..此外.本题另一点就是C输入之后要取其相反数,才干进行扩展欧几 ...

  8. 全面具体介绍一个P2P网贷领域的ERP系统的主要功能

        一般的P2P系统,至少包含PC站点的前端和后端.前端系统的功能.能够參考"P2P系统哪家强,功能事实上都一样" http://blog.csdn.net/fansunion ...

  9. 2016.03.28,英语,《Vocabulary Builder》Unit 07

    vis: comes from a Latin verb meaning 'see'. vision: ['vɪʒn] n. 视觉,先见之明,光景,视力,眼力,幻想,影像 vt. 幻想. ; vid- ...

  10. bzoj3998: [TJOI2015]弦论(SAM+dfs)

    3998: [TJOI2015]弦论 题目:传送门 题解: SAM的入门题目(很好的复习了SAM并加强Right集合的使用) 其实对于第K小的字符串直接从root开始一通DFS就好,因为son边是直接 ...