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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. const int MAXN = 3 * 1e6 + 10, P = 998244353, G = 3;
  5. LL a[MAXN], b[MAXN];
  6. int N, M, limit = 1, L, r[MAXN], Gi;
  7. inline LL fastpow(LL a, LL k) {
  8. LL base = 1;
  9. while(k) {
  10. if(k & 1) base = (base * a ) % P;
  11. a = (a * a) % P;
  12. k >>= 1;
  13. }
  14. return base % P;
  15. }
  16. inline void NTT(LL *A, int type) {
  17. for (int i = 0; i < limit; i++) {
  18. if(i < r[i]) swap(A[i], A[r[i]]);
  19. }
  20. for (int mid = 1; mid < limit; mid <<= 1) {
  21. LL Wn = fastpow (type == 1 ? G : Gi , (P - 1) / (mid << 1));
  22. for(int j = 0; j < limit; j += (mid << 1)) {
  23. LL w = 1;
  24. for (int k = 0; k < mid; k++, w = (w * Wn) % P) {
  25. int x = A[j + k], y = (w * A[j + k + mid]) % P;
  26. A[j + k] = (x + y) % P;
  27. A[j + k + mid] = (x - y + P) % P;
  28. }
  29. }
  30. }
  31. }
  32. int main () {
  33. Gi = fastpow (G, P - 2);
  34. cin >> N >> M;
  35. for (int i = 0; i <= N; i++) {cin >> a[i]; a[i] = (a[i] + P) % P;}
  36. for (int i = 0; i <= M; i++) {cin >> b[i]; b[i] = (b[i] + P) % P;}
  37. while (limit <= N + M) limit <<= 1, L++;
  38. for (int i = 0; i < limit; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (L - 1));
  39. NTT (a, 1); NTT (b, 1);
  40. for (int i = 0; i < limit; i++) a[i] = (a[i] * b[i]) % P;
  41. NTT (a, -1);
  42. LL inv = fastpow (limit, P - 2);
  43. for (int i = 0; i <= N + M; i++) {
  44. printf ("%d ", (a[i] * inv) % P);
  45. }
  46. return 0;
  47. }

NTT学习笔记的更多相关文章

  1. FFT和NTT学习笔记_基础

    FFT和NTT学习笔记 算法导论 参考(贺) http://picks.logdown.com/posts/177631-fast-fourier-transform https://blog.csd ...

  2. FFT、NTT学习笔记

    参考资料 picks miskcoo menci 胡小兔 unname 自为风月马前卒 上面是FFT的,学完了就来看NTT吧 原根 例题:luogu3803 fft优化后模板 #include < ...

  3. FFT&NTT学习笔记

    具体原理就不讲了qwq,毕竟证明我也不太懂 FFT(快速傅立叶变换)&NTT(快速数论变换) FFT //求多项式乘积 //要求多项式A和多项式B的积多项式C //具体操作就是 //DFT(A ...

  4. NTT 学习笔记

    引入 \(\tt NTT\) 和 \(\tt FFT\) 有什么不一样呢? 就是 \(\tt NTT\) 是可以用来取模的,而且没有复数带来的精度误差. 最最重要的是据说 \(\tt NTT\) 常数 ...

  5. FFT/NTT 学习笔记

    0. 前置芝士 基础群论 复数 \(\mathbb C = \mathbb R[x^2+1]\) 则有 \(i^2+1=(-i)^2+1=0\),\(i \in \mathbb C - \mathbb ...

  6. 任意模数NTT学习笔记

    这两天有点颓,所以东西学的也很慢...这个一眼就能推出来的活生生卡了我两天.. 说几个细节: 柿子: \[f*g = (\frac{f}{M} +f\%m)*(\frac{g}{M} +g\%m) \ ...

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

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

  8. 「学习笔记」FFT 之优化——NTT

    目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NT ...

  9. 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT)

    再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Bluestein算法+分治FFT+FFT的优化+任意模数NTT) 目录 再探快速傅里叶变换(FFT)学习笔记(其三)(循环卷积的Blueste ...

随机推荐

  1. Xamarin + MvvmCross 安装 Part 1

    前言 最近,由于工作需要,公司准备开发移动端APP.临近年底,公司不准备大面招人,由于公司一直基于.net平台进行开发,本人自告奋勇,准备先用xamarin做下移动开发.开始了在网上不停的google ...

  2. SpringBoot2.0.3 + SpringSecurity5.0.6 + vue 前后端分离认证授权

    新项目引入安全控制 项目中新近添加了Spring Security安全组件,前期没怎么用过,加之新版本少有参考,踩坑四天,终完成初步解决方案.其实很简单,Spring Security5相比之前版本少 ...

  3. DRF 分页组件

    Django Rest Framework 分页组件 DRF的分页 为什么要使用分页 其实这个不说大家都知道,大家写项目的时候也是一定会用的, 我们数据库有几千万条数据,这些数据需要展示,我们不可能直 ...

  4. Win10报错0x800f0906

    在安装适用于Linux的Windows子系统(Beta)的时候,有选中开发人员模式这一步设置->更新和安全->针对开发人员->选中开发人员模式 如果报错0x800f0906 那是因为 ...

  5. Android stadio 生成项目 Plugin with id 'com.android.application' not found

    buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2. ...

  6. Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)

    第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...

  7. stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误

    @2019-01-24 [小记] 在学习 rt-thread BSP制作过程中,发现文件<stm32f1xx_hal.h>中 Env工具生成的原始顺序 1. #include " ...

  8. 【php】php实现数组分块

    有时候需要将一个大数组按一定大小分块,那么可以实现这个功能,代码如下: /** * @param array $arr * @param int $size <p> * @param bo ...

  9. 20165223 week4测试补交与总结

    JDB调试程序 调试代码 public class SumofRecur1{ public static void main(String[] args) { int i = 0; for(Strin ...

  10. 关于windows下NODE_ENV=test无效的情况解决办法

    redux的单元测试命令为 NODE_ENV=test mocha --recursive --compilers js:babel-core/register --require ./test/se ...