HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)
题意:计算A*B,A,B均为长度小于50000的整数。
这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT。
A和B的存储均用long long,在计算乘积的时候转化成double,计算完成后再转回来即可。
测得base在精度允许范围内最多能开到10000。
把平方和快速幂的函数也写上了,可以当模板用~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+,inf=0x3f3f3f3f;
const db pi=acos(-);
const ll P[]= {,,,,};
struct cpl {
db x,y;
cpl operator-(cpl& b) {return {x-b.x,y-b.y};}
cpl operator+(cpl& b) {return {x+b.x,y+b.y};}
cpl operator*(cpl& b) {return {x*b.x-y*b.y,x*b.y+y*b.x};}
} A[N],B[N];
void change(cpl* a,int n) {
for(int i=,j=n>>,k; i<n-; ++i) {
if(i<j)swap(a[i],a[j]);
k=n>>;
while(j>=k)j-=k,k>>=;
j+=k;
}
}
void FFT(cpl* a,int n,int f) {
change(a,n);
for(int k=; k<n; k<<=) {
cpl wn= {cos(pi*f/k),sin(pi*f/k)};
for(int i=; i<n; i+=k<<) {
cpl w{,};
for(int j=i; j<i+k; ++j) {
cpl x=a[j],y=w*a[j+k];
a[j]=x+y,a[j+k]=x-y;
w=w*wn;
}
}
}
if(!~f)for(int i=; i<n; ++i)a[i].x/=n,a[i].y/=n;
}
struct Bigint {
static const int N=1e5+;
static const int bit=;
static const ll base=pow(,bit);
int n;
ll a[N];
ll& operator[](int x) {return a[x];}
void init(ll x) {
memset(a,,sizeof a);
a[]=x,n=;
}
void init(char* s) {
memset(a,,sizeof a);
int m=strlen(s);
for(int i=; i<m; ++i)a[(m--i)/bit]+=(s[i]-'')*P[(m--i)%bit];
n=(m-)/bit;
}
void Sqr() {
int m;
for(m=; m<=n*; m<<=);
for(int i=; i<m; ++i)A[i]= {a[i],};
FFT(A,m,);
for(int i=; i<m; ++i)A[i]=A[i]*A[i];
FFT(A,m,-);
for(int i=; i<m; ++i)a[i]=A[i].x+0.5;
for(int i=; i<m; ++i) {
if(a[i]>=base) {
a[i+]+=a[i]/base;
a[i]%=base;
if(i==m-)++m;
}
}
for(n=m-; n>&&!a[n]; --n);
}
void Mul(Bigint& b) {
int m;
for(m=; m<=n*||m<=b.n*; m<<=);
for(int i=; i<m; ++i)A[i]= {a[i],},B[i]= {b[i],};
FFT(A,m,),FFT(B,m,);
for(int i=; i<m; ++i)A[i]=A[i]*B[i];
FFT(A,m,-);
for(int i=; i<m; ++i)a[i]=A[i].x+0.5;
for(int i=; i<m; ++i) {
if(a[i]>=base) {
a[i+]+=a[i]/base;
a[i]%=base;
if(i==m-)++m;
}
}
for(n=m-; n>&&!a[n]; --n);
}
void Pow(int p) {
Bigint b=*this;
this->init();
for(; p; p>>=,b.Sqr())if(p&)this->Mul(b);
}
void pr() {
for(int i=n; i>=; --i) {
if(i==n)printf("%lld",a[i]);
else printf("%04lld",a[i]);
}
puts("");
}
} a,b;
char s1[N],s2[N]; int main() {
while(scanf("%s%s",s1,s2)==) {
a.init(s1),b.init(s2);
a.Mul(b);
a.pr();
}
return ;
}
HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)的更多相关文章
- 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
/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...
- HDU - 1402 A * B Problem Plus FFT裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...
- HDU 1402 A * B Problem Plus (FFT模板题)
FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...
- P1919 FFT加速高精度乘法
P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...
- HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式
http://acm.hdu.edu.cn/showproblem.php?pid=1402 快速傅里叶变换优化的高精度乘法. https://blog.csdn.net/ggn_2015/artic ...
- SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法
SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...
- FFT实现高精度乘法
你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...
- BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法
Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...
随机推荐
- JavaScript:学习笔记(3)——正则表达式的应用
JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象 ...
- PAT 天梯赛 L1-032. Left-pad 【字符串】
题目链接 https://www.patest.cn/contests/gplt/L1-032 思路 要分两种情况处理 ①字符串长度 <= 填充长度 就在字符串前面输出(填充长度 - 字符串长度 ...
- iOS_Quartz 2D绘图
目 录: 一.基础知识掌握 二.Quartz 2D绘图基础:CGContextRef实现简单地绘制图形 三.CGContextRef实现文字.图片.基于路径的图形绘制 四.在内存中绘制位图 五.添加 ...
- 重用UITableViewCell对象的概念
重用UITableViewCell对象 UITableView控件十分常见,基本上我们随意打开一款App都能见到,它被用来列表展示数据,而其中的每一行内容都是一个cell对象 我们知道手机设备上的内存 ...
- unity json解析IPA后续
以前说到的,有很大的限制,只能解析简单的类,如果复杂的就会有问题,从老外哪里看到一片博客,是将类中的list 等复杂对象序列化, using UnityEngine; using System.C ...
- INSPIRED启示录 读书笔记 - 第4章 产品管理与产品设计
理解用户体验设计 1.用户研究:专门研究.分析用户,评估产品或产品原型是否符合特定用户的使用习惯.其具体工作包括拟订恰当的测试项目,监督测试,评估测试结果,提出改进方案 2.交互设计:在理解目标用户的 ...
- LCN协调者服务集群
官方文档: https://github.com/codingapi/tx-lcn/wiki/TxManager%E9%9B%86%E7%BE%A4%E8%AF%B4%E6%98%8E 核心原理 通过 ...
- Centos7 远程登录端口22 设置
第一步 #查看本机是否安装SSH软件包 [root@localhost ~]# rpm -qa | grep ssh openssh-server-6.6.1p1-12.el7_1.x86_64 op ...
- JavaScript -- Input Select 操作, 级联菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Ubuntu 没有mkinitrd 解决方法
1. 先apt-get install 先装cramfsprogs 2. http://archive.debian.net/zh-cn/sarge/initrd-tools 下载initrd-to ...