模板 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 ...
随机推荐
- Project Euler 8 Largest product in a series
题意:寻找这 1000 个数中相邻 13 个数相乘积最大的值 思路:首先想到的是暴力,但是还可以利用之前记录过的数值,什么意思呢?即在计算 2 - 14 后,再计算 3 - 15 时完全可以利用之前计 ...
- 指针FHQTreap
不太友好的代码 题面依旧是普通平衡树 //Writer : Hsz %WJMZBMR%tourist%hzwer #include <bits/stdc++.h> #define LL l ...
- [剑指offer] 50. 第一个只出现一次的字符 + map,hashmap 及其区别
class Solution { public: int FirstNotRepeatingChar(string str) { map<char,int>mp; ;i<str.si ...
- 关于python从Oracle中读取数据中文全是问号的问题
import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' 问题搞定
- robot Framework控制浏览器
向下 向上为负值
- MySQL 触发器 -1
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...
- Storm同时接收多个源(spout和bolt)
参考: http://blog.csdn.net/nyistzp/article/details/51483779
- 【C++】通用单链表
在C++的学习中,採用模板类,而採用虚函数实现多态性.达到通用的目的.结点类数据域被改造为指针,而把数据放在一个抽象类中.由指针与之建立联系. 採用虚函数实现多态性,达到通用的目的.堆内存的分配与释放 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序 非常多开 ...
- android setCookie 免登录
CookieSyncManager.createInstance(getActivity()); CookieManager cookieManager = CookieManager.getInst ...