先看看。

通常模数常见的有998244353,1004535809,469762049,这几个的原根都是3。
所求的项数还不能超过2的23次方(因为998244353的分解)。

感觉没啥用。

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. template <class T>
  5. inline void swap(T &a, T &b)
  6. {
  7. T c;
  8. c = a;
  9. a = b;
  10. b = c;
  11. }
  12.  
  13. const int siz = ;
  14.  
  15. const int P = , G = ;
  16.  
  17. inline int pow(int a, int b)
  18. {
  19. int r = ;
  20.  
  21. while (b)
  22. {
  23. if (b & )
  24. r = 1LL * r * a % P;
  25.  
  26. b >>= , a = 1LL * a * a % P;
  27. }
  28.  
  29. return r;
  30. }
  31.  
  32. inline void calculateNTT(int *s, int n, int f)
  33. {
  34. {
  35. int cnt = ;
  36.  
  37. static int rev[siz];
  38.  
  39. while (n >> cnt)++cnt; --cnt;
  40.  
  41. memset(rev, , sizeof rev);
  42.  
  43. for (int i = ; i < n; ++i)
  44. {
  45. rev[i] |= rev[i >> ] >> ;
  46. rev[i] |= (i & ) << (cnt - );
  47. }
  48.  
  49. for (int i = ; i < n; ++i)if (i < rev[i])swap(s[i], s[rev[i]]);
  50. }
  51.  
  52. {
  53. for (int i = ; i < n; i <<= )
  54. {
  55. int wn = pow(G, (P - ) / (i * ));
  56.  
  57. if (f == -)wn = pow(wn, P - );
  58.  
  59. for (int j = ; j < n; j += (i << ))
  60. {
  61. int wk = ;
  62.  
  63. for (int k = ; k < i; ++k, wk = 1LL * wk * wn % P)
  64. {
  65. int x = s[j + k];
  66. int y = 1LL * s[i + j + k] * wk % P;
  67.  
  68. s[j + k] = x + y;
  69. s[i + j + k] = x - y;
  70.  
  71. s[j + k] = (s[j + k] % P + P) % P;
  72. s[i + j + k] = (s[i + j + k] % P + P) % P;
  73. }
  74. }
  75. }
  76. }
  77.  
  78. {
  79. if (f == -)
  80. {
  81. int inv = pow(n, P - );
  82.  
  83. for (int i = ; i < n; ++i)
  84. s[i] = 1LL * s[i] * inv % P;
  85. }
  86. }
  87. }
  88.  
  89. signed main(void)
  90. {
  91. static char sa[siz];
  92. static char sb[siz];
  93.  
  94. scanf("%s", sa);
  95. scanf("%s", sb);
  96.  
  97. static int la, a[siz];
  98. static int lb, b[siz];
  99.  
  100. la = strlen(sa);
  101. lb = strlen(sb);
  102.  
  103. for (int i = ; i < la; ++i)a[i] = sa[la - i - ] - '';
  104. for (int i = ; i < lb; ++i)b[i] = sb[lb - i - ] - '';
  105.  
  106. int len; for (len = ; len < la || len < lb; len <<= );
  107.  
  108. calculateNTT(a, len << , +);
  109. calculateNTT(b, len << , +);
  110.  
  111. for (int i = ; i < len << ; ++i)a[i] = 1LL * a[i] * b[i] % P;
  112.  
  113. calculateNTT(a, len << , -);
  114.  
  115. for (int i = ; i < len << ; ++i)a[i + ] += a[i] / , a[i] = a[i] % ;
  116.  
  117. len <<= ; while (!a[len])--len;
  118.  
  119. for (int i = len; ~i; --i)printf("%d", a[i]); puts("");
  120. }

快速傅里叶变换FFT

模板 - 数学 - 快速傅里叶变换/快速数论变换(FFT/NTT)的更多相关文章

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

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

  2. 快速傅里叶变换(Fast-Fourier Transform,FFT)

    数学定义: (详细参考:https://www.baidu.com/link?url=oYAuG2o-pia_U3DlF5n_MJZyE5YKfaVRUHTTDbM1FwM_kDTjGCxKpw_Pb ...

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

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

  4. [学习笔记&教程] 信号, 集合, 多项式, 以及各种卷积性变换 (FFT,NTT,FWT,FMT)

    目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理 ...

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

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

  6. 快速傅里叶变换学习笔记(FFT)

    什么是FFT FFT是用来快速计算两个多项式相乘的一种算法. 如果我们暴力计算两个多项式相乘,复杂度必然是\(O(n^2)\)的,而FFT可以将复杂度降至\(O(nlogn)\) 如何FFT 要学习F ...

  7. 快速傅里叶变换(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. 讲解 ...

  8. 快速数论变换(NTT)

    刚学完FFT,干脆把NTT也学了算了 (一)预备知识 关于原根,这里说得蛮详细的百度百科 为什么使用原根呢?为什么原根可以替代\(\omega_{n}\)呢?想知道为什么就看here NTT用到的各种 ...

  9. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

随机推荐

  1. BUPT复试专题—内存分配(2014-2)

    题目描述 在操作系统中,内存分配是非常重要的工作.己知内存空间由N个内存块组成,这些内存块从1到N编号.进行内存分配时,操作系统将选择一块大小足够的内存全部分配给请求内存的进程.例如,当进程请求10M ...

  2. poj1870--Bee Breeding(模拟)

    题目链接:点击打开链接 题目大意:给出一个蜂窝,也就是有六边形组成,从内向外不断的循环(如图).给出两个数的值u,v按六边形的走法,由中心向六个角走.问由u到v的的最小步数. 首先处理处每个数的坐标, ...

  3. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式

    Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...

  4. java开始到熟悉100-102

    本次内容:arraylist() 1. package list; import java.util.ArrayList; import java.util.Date; import java.uti ...

  5. Java基础:执行时异常和非执行时异常

    1.Java异常机制 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为全部异常的超类. Java中的异常分为两大类:错误Error和异常Exception.Jav ...

  6. OpenStack IceHouse版cinder模块新添加功能

    感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...

  7. JAVA BigDecimal 高精度运算

    文章参考一位博友,由于时间太久忘了链接,见谅! public class BigDecimalUtils { private static final int DIV_SCALE = 10;// 除法 ...

  8. 阿里云安装nginx 启动失败的原因。

    阿里云编译安装nginx服务器后启动一直报下面错误. 百度了一圈,看到一个说要先关掉apache服务,感觉这个好像是对的,立马做了下面操作. 果然把nginx起了起来. 从这边才知道apache和ng ...

  9. excel 创建数据有效性及背景颜色

    需求:用excel做数据或者表格时经常需要在一列中给出固定的几个进行悬着,这是如果每次键盘输入降低工作效率.如果做成鼠标双击进行选择,则提高很多效率,比如需要给一列填写Pass或Failure时,具体 ...

  10. 1250太小了 mysql 并发

    SHOW VARIABLES LIKE '%connection%'; character_set_connection utf8mb4collation_connection utf8mb4_gen ...