\(\text{FFT}\)

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#define re register
using namespace std; const int N = 2e6 + 1e5;
int c[N], rev[N];
char s[N]; const double Pi = acos(-1.0);
struct complex{
double x, y;
inline complex(double xx = 0, double yy = 0){x = xx, y = yy;}
inline complex operator + (const complex &b) const {return complex(x + b.x, y + b.y);}
inline complex operator - (const complex &b) const {return complex(x - b.x, y - b.y);}
inline complex operator * (const complex &b) const {return complex(x * b.x - y * b.y, x * b.y + y * b.x);}
}a[N], b[N]; inline void FFT(complex *a, int lim, int inv)
{
for(re int i = 0; i < lim; i++)
if (i < rev[i]) swap(a[i], a[rev[i]]);
for(re int mid = 1; mid < lim; mid <<= 1)
{
complex I = complex(cos(Pi / mid), inv * sin(Pi / mid));
for(re int i = 0; i < lim; i += mid << 1)
{
complex W = complex(1, 0);
for(re int j = 0; j < mid; j++, W = W * I)
{
complex x = a[i + j], y = W * a[i + j + mid];
a[i + j] = x + y, a[i + j + mid] = x - y;
}
}
}
} int main()
{
scanf("%s", s);
int n = strlen(s);
for(re int i = 0; i < n; i++) a[i].x = s[n - i - 1] ^ 48;
scanf("%s", s);
int m = strlen(s);
for(re int i = 0; i < m; i++) b[i].x = s[m - i - 1] ^ 48; int limit = 1;
while (limit < n + m - 1) limit <<= 1;
int bit = 0;
while ((1 << bit) < limit) ++bit;
for(re int i = 0; i < limit; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); FFT(a, limit, 1), FFT(b, limit, 1);
for(re int i = 0; i < limit; i++) a[i] = a[i] * b[i];
FFT(a, limit, -1);
for(re int i = 0; i < limit; i++) c[i] = int(a[i].x / limit + 0.5);
for(re int i = 0; i < limit; i++)
{
if (c[i] >= 10) c[i + 1] += c[i] / 10, limit = ((i + 1) == limit ? limit + 1 : limit);
c[i] %= 10;
}
while (limit && !c[limit]) --limit;
for(re int i = limit; i >= 0; i--) printf("%d", c[i]);
}

\(\text{NTT}\)

#include <cstdio>
#include <iostream>
#include <cstring>
#define re register
using namespace std; const int N = 2e6 + 1e5;
const int P = 998244353, g = 3;
int a[N], b[N], rev[N];
char s[N]; inline int fpow(int x, int y)
{
int res = 1;
for(; y; y >>= 1)
{
if (y & 1) res = 1LL * res * x % P;
x = 1LL * x * x % P;
}
return res;
} inline void NTT(int *a, int lim, int inv)
{
if (lim == 1) return;
for(re int i = 0; i < lim; i++)
if (i < rev[i]) swap(a[i], a[rev[i]]);
for(re int mid = 1, I; mid < lim; mid <<= 1)
{
I = fpow(g, (P - 1) / (mid << 1));
if (inv == -1) I = fpow(I, P - 2);
for(re int i = 0, W; i < lim; i += mid << 1)
{
W = 1;
for(re int j = 0, x, y; j < mid; j++, W = 1LL * W * I % P)
{
x = a[i + j], y = 1LL * W * a[i + j + mid] % P;
a[i + j] = (x + y) % P, a[i + j + mid] = (x - y + P) % P;
}
}
}
} int main()
{
scanf("%s", s);
int n = strlen(s);
for(re int i = 0; i < n; i++) a[i] = s[n - i - 1] ^ 48;
scanf("%s", s);
int m = strlen(s);
for(re int i = 0; i < m; i++) b[i] = s[m - i - 1] ^ 48; int limit = 1;
while (limit < n + m - 1) limit <<= 1;
int bit = 0;
while ((1 << bit) < limit) ++bit;
for(re int i = 0; i < limit; i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1)); NTT(a, limit, 1), NTT(b, limit, 1);
for(re int i = 0; i < limit; i++) a[i] = 1LL * a[i] * b[i] % P;
NTT(a, limit, -1);
int inv = fpow(limit, P - 2);
for(re int i = 0; i < limit; i++) a[i] = 1LL * a[i] * inv % P;
for(re int i = 0; i < limit; i++)
{
if (a[i] >= 10) a[i + 1] += a[i] / 10, limit = ((i + 1) == limit ? limit + 1 : limit);
a[i] %= 10;
}
while (limit && !a[limit]) --limit;
for(re int i = limit; i >= 0; i--) printf("%d", a[i]);
}

最新文章

  1. 如何从sun公司官网下载java API文档(转载)
  2. 转:Java面试题集(1-50)
  3. js对象的引用
  4. JS获取客户端IP地址、MAC和主机名七种方法
  5. javaweb学习总结(七)——HttpServletResponse对象(一)(转)
  6. 【排序算法】冒泡排序算法 Java实现
  7. Upgrade with the Gradle Wrapper, gradlew升级
  8. C#装箱和拆箱。
  9. dom解析xml随笔
  10. java 组件开发中的日志记录问题
  11. Git命令的使用_操作远程仓库——详细教程3
  12. 《剑指offer》-链表的第一个公共节点
  13. 优化 要引入多个 模块 使用调用的方法,让管理更便捷 --execfile() 函数
  14. 关于AJAX与form表单提交数据的格式
  15. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
  16. LOJ#2799. 「CCC 2016」生命之环
  17. Oracle 11gR2 RAC 常用维护操作 说明
  18. C#操作Xml树的扩展类
  19. Python基础3:字符编码
  20. html5+css3 h5页面生成的思路

热门文章

  1. Go1.20 新版覆盖率方案解读
  2. 数电第二周总结_by_yc
  3. 关于盒子动态高度与transition的问题
  4. 最大值减去最小值小于或等于 num 的子数组数量问题
  5. 实施 GitOps 的三个关键步骤
  6. &lt;一&gt;C++ STL
  7. 创建并且配置win10系统虚拟机
  8. Pytorch框架详解之一
  9. vue 实现一键复制功能(两种方式)
  10. python 小球碰撞游戏