博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NTT学习笔记
阅读量:7225 次
发布时间:2019-06-29

本文共 1575 字,大约阅读时间需要 5 分钟。

\(FFT\)相对应的,把单位根换成了原根,把共轭复数换成了原根的逆元,最后输出的时候记得乘以原\(N\)的逆元即可.

#include 
using namespace std;#define LL long long const int MAXN = 3 * 1e6 + 10, P = 998244353, G = 3; LL a[MAXN], b[MAXN];int N, M, limit = 1, L, r[MAXN], Gi;inline LL fastpow(LL a, LL k) { LL base = 1; while(k) { if(k & 1) base = (base * a ) % P; a = (a * a) % P; k >>= 1; } return base % P;}inline void NTT(LL *A, int type) { for (int i = 0; i < limit; i++) { if(i < r[i]) swap(A[i], A[r[i]]); } for (int mid = 1; mid < limit; mid <<= 1) { LL Wn = fastpow (type == 1 ? G : Gi , (P - 1) / (mid << 1)); for(int j = 0; j < limit; j += (mid << 1)) { LL w = 1; for (int k = 0; k < mid; k++, w = (w * Wn) % P) { int x = A[j + k], y = (w * A[j + k + mid]) % P; A[j + k] = (x + y) % P; A[j + k + mid] = (x - y + P) % P; } } }}int main () { Gi = fastpow (G, P - 2); cin >> N >> M; for (int i = 0; i <= N; i++) {cin >> a[i]; a[i] = (a[i] + P) % P;} for (int i = 0; i <= M; i++) {cin >> b[i]; b[i] = (b[i] + P) % P;} while (limit <= N + M) limit <<= 1, L++; for (int i = 0; i < limit; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (L - 1)); NTT (a, 1); NTT (b, 1); for (int i = 0; i < limit; i++) a[i] = (a[i] * b[i]) % P; NTT (a, -1); LL inv = fastpow (limit, P - 2); for (int i = 0; i <= N + M; i++) { printf ("%d ", (a[i] * inv) % P); } return 0;}

转载于:https://www.cnblogs.com/maomao9173/p/10494092.html

你可能感兴趣的文章
小数在计算机里面的存放
查看>>
数据结构中的各种树简单解释
查看>>
我的朗科运维第七课
查看>>
CentOS的进程管理二
查看>>
https客户端证书导入
查看>>
用 PreparedStatement 向 SqlServer 中一次性插入多条记录
查看>>
Slackware-2014-0903
查看>>
CentOS下安装JDK1.7
查看>>
LDAP DIT设计参考
查看>>
iptables详解
查看>>
Protostuff 介绍
查看>>
一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别...
查看>>
参数验证其实可以更简明一点
查看>>
Set up Mule runtime env with mule-standalone-3.6.0
查看>>
Linux基础-linux命令:csplit
查看>>
core_framework —— 基于libev的轻量级lua网络开发框架
查看>>
回到顶部
查看>>
DES/3DES(TripleDES)加密、解密测试数据
查看>>
Maven项目标准目录结构
查看>>
Tomcat 系统架构与设计模式,第 1 部分: 工作原理
查看>>