你应该知道$FFT$是用来处理多项式乘法的吧。

那么高精度乘法和多项式乘法有什么关系呢?

观察这样一个$20$位高精度整数$11111111111111111111$

我们可以把它处理成这样的形式:$\sum_{i=0}^{19}1\times10^i$

这样就变成了一个多项式了!

直接上代码吧(以$Luogu\ P1919$为例):

#include <cmath>
#include <cstdio>
#include <algorithm>
using std::swap;const int N = 1.4e5 + 10;
const double Pi = acos(-1);
int n, m, r[N], P, ans[N];
char s[N];
struct C { double x, y; } a[N], b[N];
C operator + (C a, C b) { return (C){ a.x + b.x, a.y + b.y }; }
C operator - (C a, C b) { return (C){ a.x - b.x, a.y - b.y }; }
C operator * (C a, C b) { return (C){ a.x * b.x - a.y * b.y, a.x * b.y + b.x * a.y }; }void FFT(C f[], int opt) {for(int i = 0; i < n; ++i) if(i < r[i]) swap(f[i], f[r[i]]);for(int len = 1, nl = 2; len < n; len = nl, nl <<= 1) {C rot = (C){cos(Pi / len), opt * sin(Pi / len)};for(int l = 0; l < n; l += nl) {C w = (C){1, 0}; int r = l + len;for(int k = l; k < r; ++k, w = w * rot) {C x = f[k], y = w * f[k + len];f[k] = x + y, f[k + len] = x - y;}}}
} int main() {scanf("%d%s", &n, s + 1);for(int i = 1; i <= n; ++i) a[i - 1].x = s[n - i + 1] - '0';scanf("%s", s + 1);for(int i = 1; i <= n; ++i) b[i - 1].x = s[n - i + 1] - '0';//将字符串转化为多项式的系数--n;for(m = n + n, n = 1; n <= m; n <<= 1, ++P);for(int i = 0; i < n; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (P - 1));//蝴蝶变换FFTFFT(a, 1), FFT(b, 1);for(int i = 0; i < n; ++i) a[i] = a[i] * b[i];FFT(a, -1);for(int i = 0; i <= m; ++i) ans[i] = (int)(a[i].x / n + .5);for(int i = 0, tmp1, tmp2; i < m; ++i)ans[i + 1] += (ans[i] / 10), ans[i] %= 10;//处理进位(每个系数最多为两位数)for(int i = m, flag = 0; i >= 0; --i) {if(ans[i] != 0) flag = 1;else if(!flag) continue;printf("%d", ans[i]); }//flag为前导零标记return puts("") & 0;
}

$PS:$代码中没有处理$0\times0$的情况,请读者自行处理。

转载于:https://www.cnblogs.com/water-mi/p/10198586.html

FFT实现高精度乘法相关推荐

  1. P1919 FFT加速高精度乘法

    P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...

  2. 朴素高精度乘法的常数优化

    2015年辽宁省赛热身赛有一道高精度乘法 传送门:NEUOJ 1574 A*B 1574: A * B 时间限制: 10 Sec  内存限制: 128 MB 题目描述 Calculate $a \ti ...

  3. /* program p5_04_AC 《聪明人的游戏提高篇》 1307:【例1.3】高精度乘法

    /* program p5_04_AC <聪明人的游戏提高篇>  1307:[例1.3]高精度乘法 http://ybt.ssoier.cn:8088/problem_show.php?p ...

  4. 信息学奥赛一本通 1307:【例1.3】高精度乘法 | 1174:大整数乘法 | OpenJudge NOI 1.13 09:大整数乘法

    [题目链接] ybt 1307:[例1.3]高精度乘法 ybt 1174:大整数乘法 OpenJudge NOI 1.13 09:大整数乘法 [题目考点] 1. 高精度 考察:高精乘高精 高精度计算讲 ...

  5. 信息学奥赛一本通(1307:【例1.3】高精度乘法)

    1307:[例1.3]高精度乘法 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 30399     通过数: 10666 [题目描述] 输入两个高精度正整数M和N ...

  6. 算法提高 高精度乘法(java)

    算法提高 高精度乘法 描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩 ...

  7. 国王游戏(贪心 + 高精度乘法 + 高精度除法 + 高精度比较大小)

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏. 首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数. 然后,让这 n 位大臣排成一排,国王站在队伍 ...

  8. CCF NOI1140 高精度乘法

    问题链接:CCF NOI1140 高精度乘法. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 给两个正整数a和b,计算它们的积. 输入 两行,每行一个数分别表示a和b(位数达 ...

  9. HDU 1042 N!( 高精度乘法水 )

    链接:传送门 思路:高精度乘法板子题,高精度耗时又耗空间...... /**************************************************************** ...

最新文章

  1. 分享10个我最满意的windows工具,极大提升工作效率
  2. SQL多表连接查询(具体实例)
  3. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
  4. 数据库连接jdbc理解
  5. CSocket文件传输 分段传输的关键代码
  6. Java后台与VUE跨域交接
  7. linux C 学习 简单字符串逆序输出
  8. 今天说说微博中的“飞秋下载”
  9. linux服务器程序开发,怎样搭建一个linux开发服务器
  10. java8与函数编程资料
  11. 第三讲 配置SCCM客户端并添加角色
  12. python书籍_年度最多安利的10本Python书籍
  13. 【脑电信号】基于matlab小波工具箱脑电降噪【含Matlab源码 707期】
  14. python里countsget_Python Pandas Series.get_dtype_counts()用法及代码示例
  15. 莫烦Tensorflow学习笔记(10-12)——构建简单的神经网络及其可视化
  16. html如何控制plc,PLC系统是如何控制数控机床的
  17. Android自定义Transition动画
  18. android 音频播放过程,一种Android系统中的音频播放方法与流程
  19. libxml主要函数说明
  20. Linux服务器CPU100%问题

热门文章

  1. 在网页中的flash游戏,按方向键浏览器的滚动条会跟着滚动
  2. [Jobdu] 题目1530:最长不重复子串
  3. [Linux]Linux下经常会用到的简单实例(持续更新)
  4. css实现简单的告警提示动画效果
  5. Python排序算法之快速排序
  6. Xamarin.Forms Button长按事件
  7. 拓扑排序 确定比赛名次
  8. 九度 1474:矩阵幂(二分法)
  9. Delphi关于多线程同步的一些方法
  10. 页面那些位置是投放广告的最佳位置