Code[VS] 3123 高精度练习之超大整数乘法
FFT 做 高精度乘法
#include <bits/stdc++.h> const double pi = acos(-); struct complex
{
double a, b; inline complex(
double _a = ,
double _b = )
{
a = _a;
b = _b;
} inline friend complex operator +
(const complex &a, const complex &b)
{
return complex(a.a + b.a, a.b + b.b);
} inline friend complex operator -
(const complex &a, const complex &b)
{
return complex(a.a - b.a, a.b - b.b);
} inline friend complex operator *
(const complex &a, const complex &b)
{
return complex(a.a*b.a - a.b*b.b, a.a*b.b + a.b*b.a);
} inline friend complex & operator +=
(complex &a, const complex &b)
{
return a = a+b;
} inline friend complex & operator -=
(complex &a, const complex &b)
{
return a = a-b;
} inline friend complex & operator *=
(complex &a, const complex &b)
{
return a = a*b;
}
}; inline complex alpha(double a)
{
return complex(cos(a), sin(a));
} typedef std::vector<complex> vec; vec FFT(const vec &a)
{
int n = a.size(); if (n == )return a; complex w_k(, );
complex w_n = alpha(pi*/n); vec ar[], yr[], y(n); for (int i = ; i < n; ++i)
ar[i & ].push_back(a[i]); for (int i = ; i < ; ++i)
yr[i] = FFT(ar[i]); for (int i = ; i < n/; ++i, w_k *= w_n)
{
y[i] = yr[][i] + w_k * yr[][i];
y[i + n/] = yr[][i] - w_k * yr[][i];
} return y;
} vec IFFT(const vec &a)
{
int n = a.size(); if (n == )return a; complex w_k(, );
complex w_n = alpha(-pi*/n); vec ar[], yr[], y(n); for (int i = ; i < n; ++i)
ar[i & ].push_back(a[i]); for (int i = ; i < ; ++i)
yr[i] = IFFT(ar[i]); for (int i = ; i < n/; ++i, w_k *= w_n)
{
y[i] = yr[][i] + w_k * yr[][i];
y[i + n/] = yr[][i] - w_k * yr[][i];
} return y;
} char s1[]; int len1;
char s2[]; int len2; vec v1, v2, p1, p2, mul, ans; signed main(void)
{
scanf("%s", s1); len1 = strlen(s1);
scanf("%s", s2); len2 = strlen(s2); int len = len1 + len2; while (len != (len&-len))++len; for (int i = len1 - ; ~i; --i)v1.push_back(complex(s1[i] - '', ));
for (int i = len2 - ; ~i; --i)v2.push_back(complex(s2[i] - '', )); while ((int)v1.size() < len)v1.push_back(complex());
while ((int)v2.size() < len)v2.push_back(complex()); p1 = FFT(v1);
p2 = FFT(v2); for (int i = ; i < len; ++i)
mul.push_back(p1[i] * p2[i]); ans = IFFT(mul); std::vector<int> ret; for (int i = ; i < len; ++i)
ret.push_back((int)round(ans[i].a / len)); for (int i = ; i < len; ++i)
if (ret[i] >= )
{
ret[i + ] += ret[i] / ;
ret[i] %= ;
} while (ret.size() != && !ret[ret.size() - ])
ret.pop_back(); for (int i = ret.size() - ; i >= ; --i)
putchar('' + ret[i]);
putchar('\n');
}
@Author: YouSiki
Code[VS] 3123 高精度练习之超大整数乘法的更多相关文章
- codevs 3123 高精度练习之超大整数乘法
fft. #include<iostream> #include<cstdio> #include<cstring> #include<complex> ...
- 3123 高精度练习之超大整数乘法 - Wikioi
题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过100000位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Ou ...
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...
- c++ 超大整数除法 高精度除法
c++ 超大整数除法 高精度除法 解题思路 计算a/b,其中a为大整数,b为普通整数,商为c,余数为r. 根据手算除法的规则,上一步的余数记为r,则本次计算的被除数为t=r*10+被除数的本位数值a[ ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- codevs 3119 高精度练习之大整数开根 (各种高精+压位)
/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...
- JavaScript超大整数加法
原文:JavaScript超大整数加法 什么是「超大整数」? JavaScript 采用 IEEE754标准 中的浮点数算法来表示数字 Number. 我也没花时间去详细了解 IEEE754标准 ,但 ...
- c++ 超长整数乘法 高精度乘法
c++ 超长整数乘法 高精度乘法 解题思路 参考加法和减法解题思路 乘法不是一位一位的按照手算的方式进行计算,而是用循环用一个数的某一位去乘另外一个数 打卡代码 #include<bits/st ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
随机推荐
- 关于UIApplication单例传值
由于UIApplication的是一个系统级别的单例,那么就能够省去自己创建单例的方法,将需要需要的类对象,在UIApplication单例内声明一个,通过点语法来实现单个 需要调用的实现单例模式的类 ...
- SqlServer数据冗余的问题和解决
1问题: 1>造成了存储空间的浪费. 2>更新异常.删除异常. 所以一般情况不允许在表中出现数据冗余. 2怎么解决? 把原来表中的数据拆分成多个表来存储. 当把表中的信息拆分成多个表来存储 ...
- MySQL备份还原——AutoMySQLBackup介绍
AutoMySQLBackup是一个开源的MySQL备份脚本.可以说它是一个轻量级的备份方案,AutoMySQLBackup的安装.配置非常简单.方便.AutoMySQLBackup的sourcefo ...
- .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...
- Mysql zip包在Windows上安装配置
环境:Windows7 64位系统.mysql-5.7.16-winx64.zip 1.在mysql官网上下载所需的mysql zip包,如我下载的是mysql-5.7.16-winx64.zip: ...
- java int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- ASCII 计算机码
回车 代码:CR ASCII码:\ r ,十六进制,0x0d,回车的作用只是移动光标至该行的起始位置: 换行 代码:LF ASCII码:\ n ,十六进制,0x0a,换行至下一行行首起始位置:
- 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...
- BZOJ1878: [SDOI2009]HH的项链[树状数组 离线]
1878: [SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3486 Solved: 1738[Submit][Statu ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...