模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)
先看看。
通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3。
所求的项数还不能超过2的23次方(因为998244353的分解)。
感觉没啥用。
#include <cstdio>
#include <cstring> template <class T>
inline void swap(T &a, T &b)
{
T c;
c = a;
a = b;
b = c;
} const int siz = ; const int P = , G = ; inline int pow(int a, int b)
{
int r = ; while (b)
{
if (b & )
r = 1LL * r * a % P; b >>= , a = 1LL * a * a % P;
} return r;
} inline void calculateNTT(int *s, int n, int f)
{
{
int cnt = ; static int rev[siz]; while (n >> cnt)++cnt; --cnt; memset(rev, , sizeof rev); for (int i = ; i < n; ++i)
{
rev[i] |= rev[i >> ] >> ;
rev[i] |= (i & ) << (cnt - );
} for (int i = ; i < n; ++i)if (i < rev[i])swap(s[i], s[rev[i]]);
} {
for (int i = ; i < n; i <<= )
{
int wn = pow(G, (P - ) / (i * )); if (f == -)wn = pow(wn, P - ); for (int j = ; j < n; j += (i << ))
{
int wk = ; for (int k = ; k < i; ++k, wk = 1LL * wk * wn % P)
{
int x = s[j + k];
int y = 1LL * s[i + j + k] * wk % P; s[j + k] = x + y;
s[i + j + k] = x - y; s[j + k] = (s[j + k] % P + P) % P;
s[i + j + k] = (s[i + j + k] % P + P) % P;
}
}
}
} {
if (f == -)
{
int inv = pow(n, P - ); for (int i = ; i < n; ++i)
s[i] = 1LL * s[i] * inv % P;
}
}
} signed main(void)
{
static char sa[siz];
static char sb[siz]; scanf("%s", sa);
scanf("%s", sb); static int la, a[siz];
static int lb, b[siz]; la = strlen(sa);
lb = strlen(sb); for (int i = ; i < la; ++i)a[i] = sa[la - i - ] - '';
for (int i = ; i < lb; ++i)b[i] = sb[lb - i - ] - ''; int len; for (len = ; len < la || len < lb; len <<= ); calculateNTT(a, len << , +);
calculateNTT(b, len << , +); for (int i = ; i < len << ; ++i)a[i] = 1LL * a[i] * b[i] % P; calculateNTT(a, len << , -); for (int i = ; i < len << ; ++i)a[i + ] += a[i] / , a[i] = a[i] % ; len <<= ; while (!a[len])--len; for (int i = len; ~i; --i)printf("%d", a[i]); puts("");
}
快速傅里叶变换FFT
模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)的更多相关文章
- 快速傅里叶变换 & 快速数论变换
快速傅里叶变换 & 快速数论变换 [update 3.29.2017] 前言 2月10日初学,记得那时好像是正月十五放假那一天 当时写了手写版的笔记 过去近50天差不多忘光了,于是复习一下,具 ...
- 快速傅里叶变换(Fast-Fourier Transform,FFT)
数学定义: (详细参考:https://www.baidu.com/link?url=oYAuG2o-pia_U3DlF5n_MJZyE5YKfaVRUHTTDbM1FwM_kDTjGCxKpw_Pb ...
- 「算法笔记」快速数论变换(NTT)
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...
- [学习笔记&教程] 信号, 集合, 多项式, 以及各种卷积性变换 (FFT,NTT,FWT,FMT)
目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理 ...
- 多项式乘法(FFT)模板 && 快速数论变换(NTT)
具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DF ...
- 快速傅里叶变换学习笔记(FFT)
什么是FFT FFT是用来快速计算两个多项式相乘的一种算法. 如果我们暴力计算两个多项式相乘,复杂度必然是\(O(n^2)\)的,而FFT可以将复杂度降至\(O(nlogn)\) 如何FFT 要学习F ...
- 快速傅里叶变换(Fast Fourier Transform, FFT)和短时傅里叶变换(short-time Fourier transform,STFT )【资料整理】【自用】
1. 官方形象展示FFT:https://www.bilibili.com/video/av19141078/?spm_id_from=333.788.b_636f6d6d656e74.6 2. 讲解 ...
- 快速数论变换(NTT)
刚学完FFT,干脆把NTT也学了算了 (一)预备知识 关于原根,这里说得蛮详细的百度百科 为什么使用原根呢?为什么原根可以替代\(\omega_{n}\)呢?想知道为什么就看here NTT用到的各种 ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
随机推荐
- ubuntu uninstall postgres
Steps that worked for me on Ubuntu 8.04.2 to remove postgres 8.3 List All Postgres related packages ...
- 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...
- 计算机网络系列:2M的宽带指的是下载速度么?
本篇文章对于不懂网络的小白有点用处.避免以后闹笑话.当然.对大神来说.这都是常识了. 我相信非常多人都有过这个问题:我4M的宽带怎么下载速度才300kb/s啊啊啊.这坑爹的宽带. 我没学的时候我也会这 ...
- AspNet MVC4 教学-23:Asp.Net MVC4 Display And Editor 模板技术高速应用Demo
A.创建Basic类型的项目. B.在Model文件夹下,创建3个文件: Role.cs: using System; using System.Collections.Generic; using ...
- C#语法复习2
第五章 方法 1.方法是一块具有名称的代码 包括:方法体.方法头 局部变量必须被赋值才可以执行下面的操作.实例变量有隐式初始化.有时候,类型推断可以用var关键字,类似于C++当中的auto.用于局部 ...
- 解决最新版的ADT没有NDK选项的问题
最新版的ADT不显示NDK,解决方法有两种,第一种方法在线重装一下 这种方法有一个问题就是,google的东西我们经常不能访问,解决方法可以参考http://blog.csdn.net/shi_wei ...
- c#中的多态 c#中的委托
C#中的多态性 相信大家都对面向对象的三个特征封装.继承.多态很熟悉,每个人都能说上一两句,但是大多数都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性 ...
- NOI 2014简要题解
Day 1.Problem A. 起床困难综合症 100分做法: 把数字看成二进制数.对于初始攻击力.我们将其拆成32位,并求出每一位为0和1时经过全部防御门之后分别得到的数字.然后就是按位贪心了,我 ...
- MySQL优化之——触发器
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46763665 触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触 ...
- WebGIS中地图恢复初始位置及状态
我想实现这么一个效果:地图任意缩放后,点击一个按钮,将立刻回到地图初始加载时的位置,并且是没有缩放的状态. 怎么办呢?最好的办法就是用Home按钮. <!DOCTYPE HTML> < ...