【luogu P1919】【模板】A*B Problem升级版(FFT快速傅里叶)

【模板】A*B Problem升级版(FFT快速傅里叶)

题目链接:luogu P1919

题目大意

给你 a,b 两个数,要你求 a*b。
数很大。

思路

就是把每一位当做一项,然后做 FFT,然后不要忘记进位就可以了。
(记得倒叙储存)

代码

#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct complex { double x, y; complex (double X = 0, double Y = 0) {x = X; y = Y;} }a[4000005], b[4000005]; char as[1000001], bs[1000001]; int an, bn, limit, ln, ann[4000001], ans[4000005]; double Pi = acos(-1.0); complex operator +(complex x, complex y) { return complex(x.x + y.x, x.y + y.y); } complex operator -(complex x, complex y) { return complex(x.x - y.x, x.y - y.y); } complex operator *(complex x, complex y) { return complex(x.x * y.x - x.y * y.y, x.x * y.y + x.y * y.x); } void FFT(complex *now, int op) { for (int i = 0; i < limit; i++) if (i > ann[i]) swap(now[i], now[ann[i]]); for (int mid = 1; mid < limit; mid <<= 1) { complex Wn(cos(Pi / mid), op * sin(Pi / mid)); for (int R = (mid << 1), j = 0; j < limit; j += R) { complex w(1, 0); for (int k = 0; k < mid; k++, w = w * Wn) { complex x = now[j + k], y = w * now[j + mid + k]; now[j + k] = x + y; now[j + mid + k] = x - y; } } } } int main() { scanf("%s\n%s", &as, &bs); an = strlen(as) - 1; bn = strlen(bs) - 1; for (int i = 0; i <= an; i++)//倒叙储存 a[an - i].x = as[i] - '0'; for (int i = 0; i <= bn; i++) b[bn - i].x = bs[i] - '0'; limit = 1; while (limit < an + bn) { limit <<= 1; ln++; } for (int i = 0; i < limit; i++) ann[i] = (ann[i >> 1] >> 1) | ((i & 1) << (ln - 1)); FFT(a, 1); FFT(b, 1); for (int i = 0; i <= limit; i++) a[i] = a[i] * b[i]; FFT(a, -1); for (int i = 0; i <= limit; i++) { ans[i] += (int)(a[i].x / limit + 0.5); if (ans[i] >= 10) {//进位 ans[i + 1] += ans[i] / 10; ans[i] %= 10; if (i == limit) limit++; } } while (limit && !ans[limit]) limit--; for (int i = 0; i <= limit; i++) printf("%d", ans[limit - i]); return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/luogu_P1919.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示