题意:计算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实现高精度乘法)的更多相关文章

  1. 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 ...

  2. hdu 1402 A * B Problem Plus FFT

    /* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...

  3. HDU - 1402 A * B Problem Plus FFT裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...

  4. HDU 1402 A * B Problem Plus (FFT模板题)

    FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...

  5. P1919 FFT加速高精度乘法

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

  6. HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 快速傅里叶变换优化的高精度乘法. https://blog.csdn.net/ggn_2015/artic ...

  7. SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法

    SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...

  8. FFT实现高精度乘法

    你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...

  9. BZOJ2179: FFT快速傅立叶 FFT实现高精度乘法

    Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring ...

随机推荐

  1. Hadoop学习基础之三:MapReduce

    现在是讨论这个问题的不错的时机,因为最近媒体上到处充斥着新的革命所谓“云计算”的信息.这种模式需要利用大量的(低端)处理器并行工作来解决计算问题.实际上,这建议利用大量的低端处理器来构建数据中心,而不 ...

  2. python删除列表中所有的空元素

    while '' in list: list.remove('')

  3. Loadrunder之脚本篇——关联函数对话框详解

    Insert->New Step,打开Add Step对话框 选择函数web_reg_save_param,点击OK,打开关联函数设置窗口 说明: Parameter Name 此处设置存放参数 ...

  4. Sourse Insight使用过程中的常使用功能简介

    1.查找定义: 在编辑区内,选中任意一个变量.函数.宏等,点击右键->Jump Definition,或者直接Ctrl+左击 2.编辑区切换

  5. [转]AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充 ...

  6. GP DBA基本操作

    1.查看队列情况 SELECT * FROM gp_toolkit.gp_resqueue_status; 如果出现了资源占用大于1.1 e+11SQL,则可能存在不合理执行计划的SQL, 基本跑不出 ...

  7. linux基础四----samba&&nginx

    一 samba 1环境配置: a.确保linux下防火墙关闭比或开放共享目录权限 iPtables -F b.确保setlinux关闭:setenforce 0 c.配置iP 2安装软件包:yum i ...

  8. copy deepcopy辨析

    copy deepcopy讲的是复制源对象的改变对copy出来的对象的影响: 我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在. 所以改变原有被复制对象不会对已经复制 ...

  9. R的几个基础函数

    本章目录: 1.路径和文件 2.数据转换 3.获得帮助 路径和文件: 1.工作路径: 显示当前路径:getwd() 设置路径:setwd(“绝对路径”) 2.目录: 创建目录:dir.create(& ...

  10. Python内置标准模块

    time 模块 1 >>> import time 2 >>> time.time() 3 1491064723.808669 4 >>> # t ...