FFT实现高精度乘法
你应该知道$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));
//蝴蝶变换FFT
FFT(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$的情况,请读者自行处理。
FFT实现高精度乘法的更多相关文章
- P1919 FFT加速高精度乘法
P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...
- BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法
Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...
- SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法
SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)
题意:计算A*B,A,B均为长度小于50000的整数. 这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT. A和B ...
- 高精度乘法(FFT)
学会了FFT之后感觉自己征服了世界! 当然是幻觉... 不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果. 一般比较凶残的计数动规题都需要FFT(n<=1e9). 下面是高精度乘法 ...
- [vijos P1040] 高精度乘法
如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...
- 【PKU1001】Exponentiation(高精度乘法)
Exponentiation Time Limit: 500MS Memory Limit: 10000K Total Submissions: 145642 Accepted: 35529 ...
- hdu 1042 N!(高精度乘法 + 缩进)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...
随机推荐
- 编辑器vi命令
代码: # vi + 文件名 //将光标放在文档最下面 进入编辑器后: i:插入 x:删除 w:保存 q:退出不保存 q!:强制退出不保存 wq:保存并退出
- 希尔排序Shell sort
希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 ...
- 记一次rsync日志报错directory has vanished
中午两点的时候邮件告知rsync同部svn源库失败,看rsync日志报错显示如上,当时还在上课,没在公司,怀疑是不是有人动了svn的版本库,后来询问同事并通过vpn登录服务器上查看版本库是正常的,也没 ...
- Java——Iterate through a HashMap
遍历Map import java.util.*; public class IterateHashMap { public static void main(String[] args) { Map ...
- IIS 搭建
1. 在打开程序功能里面,点击IIS安装.注意要选择适当的各种有用的服务.例如默认文档就需要安装非IIS下面的选项. 2. IIS部署网站可以参考网上的步骤.会遇到500处理程序“Extensionl ...
- 使用abp的 redis cache
top 使用abp的 redis cache -1. 在微软维护的github项目的release里找到redis的windows版本 64位 大约5M,安装,安装,然后在安装目录找到redis.wi ...
- HDU 2059 龟兔赛跑 (dp)
题目链接 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击--赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成 ...
- [IOS]vmxsmc.exe已停止工作 VMware11 Unlocker for Mac OSX无法使用的解决办法.
今天我帮同事安装VMware workstation12后发现之前的unlocker已经无法进行解锁了(就是VMware新建虚拟机无App Mac选项) 使用unlocker会出现vmsxmc.exe ...
- embed标签 阻止点击事件 让父元素处理点击事件
由于规定页面显示的PDF文件要有固定大小,使得页面风格统一 最开始发现了CSS样式pointer-events 写出如下代码,在360急速浏览器急速模式中访问可在点击PDF控件时可跳转页面 <a ...
- Linux中source命令的用法
source命令: source命令也称为“点命令”,也就是一个点符号(.).source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录.因为linux所有的操作都会变成文 ...