ACM学习历程—51NOD1028 大数乘法V2(FFT)

news/2025/5/25 5:53:36

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028

题目大意就是求两个大数的乘法。

但是用普通的大数乘法,这个长度的大数肯定不行。

大数可以表示点值表示法,然后卷积乘法就能用FFT加速运算了。

这道题是来存模板的。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#define LL long longusing namespace std;//多项式乘法运算
//快速傅里叶变换
//FFT
//用于求两个多项式的卷积,但有精度损失
//时间复杂度nlogn
const int maxN = 400005;
const double PI = acos(-1.0);struct Complex
{double r, i;Complex(double rr = 0.0, double ii = 0.0){r = rr;i = ii;}Complex operator+(const Complex &x){return Complex(r+x.r, i+x.i);}Complex operator-(const Complex &x){return Complex(r-x.r, i-x.i);}Complex operator*(const Complex &x){return Complex(r*x.r-i*x.i, i*x.r+r*x.i);}
};//雷德算法--倒位序
//Rader算法
//进行FFT和IFFT前的反转变换。
//位置i和 (i二进制反转后位置)互换
void Rader(Complex y[], int len)
{int j = len>>1;for(int i = 1; i < len-1; i++){if (i < j) swap(y[i], y[j]);int k = len >> 1;while (j >= k){j -= k;k >>= 1;}if (j < k) j += k;}
}//FFT实现
//len必须为2^k形式,
//on==1时是DFT,on==-1时是IDFT
void FFT(Complex y[], int len, int on)
{Rader(y, len);for (int h = 2; h <= len; h<<=1)//分治后计算长度为h的DFT
    {Complex wn(cos(-on*2*PI/h), sin(-on*2*PI/h)); //单位复根e^(2*PI/m)用欧拉公式展开for (int j = 0; j < len; j += h){Complex w(1, 0);//旋转因子for (int k = j; k < j+h/2; k++){Complex u = y[k];Complex t = w*y[k+h/2];y[k] = u+t;//蝴蝶合并操作y[k+h/2] = u-t;w = w*wn;//更新旋转因子
            }}}if (on == -1)for (int i = 0; i < len; i++)y[i].r /= len;
}//求卷积
void Conv(Complex a[], Complex b[], int ans[], int len)
{FFT(a, len, 1);FFT(b, len, 1);for (int i = 0; i < len; i++)a[i] = a[i]*b[i];FFT(a, len, -1);//精度复原for(int i = 0; i < len; i++)ans[i] = a[i].r+0.5;
}//进制恢复
//用于大数乘法
void turn(int ans[], int len, int unit)
{for(int i = 0; i < len; i++){ans[i+1] += ans[i]/unit;ans[i] %= unit;}
}char str1[maxN], str2[maxN];
Complex za[maxN],zb[maxN];
int ans[maxN];
int len;void init(char str1[], char str2[])
{int len1 = strlen(str1);int len2 = strlen(str2);len = 1;while (len < 2*len1 || len < 2*len2) len <<= 1;int i;for (i = 0; i < len1; i++){za[i].r = str1[len1-i-1]-'0';za[i].i = 0.0;}while (i < len){za[i].r = za[i].i = 0.0;i++;}for (i = 0; i < len2; i++){zb[i].r = str2[len2-i-1]-'0';zb[i].i = 0.0;}while (i < len){zb[i].r = zb[i].i = 0.0;i++;}
}void work()
{Conv(za, zb, ans, len);turn(ans, len, 10);while (ans[len-1] == 0) len--;for (int i = len-1; i >= 0; i--)printf("%d", ans[i]);printf("\n");
}int main()
{//freopen("test.in", "r", stdin);while (scanf("%s%s", str1, str2) != EOF){init(str1, str2);work();}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/andyqsmart/p/4972986.html

文章来源:https://blog.csdn.net/weixin_30905133/article/details/96770990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-16610.html

相关文章

【BZOJ】【2809】【APIO2012】派遣dispatching

贪心/可并堆 跪了……我这么弱果然还是应该回家种红薯去…… 考虑选人的时候&#xff0c;每个人对答案的贡献其实是一样的&#xff0c;都是1&#xff0c;那么我们就贪心地去选花钱少的就好啦~ 具体的做法&#xff1a;倒着枚举&#xff08;因为有b[i]<i&#xff09;&#xff…

python 魔法函数_python常用魔法函数

所有类的超类object&#xff0c;有一个默认包含pass的__init__()实现&#xff0c;这个函数会在对象初始化的时候调用&#xff0c;我们可以选择实现&#xff0c;也可以选择不实现&#xff0c;一般建议是实现的&#xff0c;不实现对象属性就不会被初始化&#xff0c;虽然我们仍然…

如何将Maven项目中引用的Jar包复制到一个lib文件夹中

Maven的非web项目在执行时需要引用很多jar包&#xff0c;这时候通常的做法是将这些jar包统一放到lib目录中&#xff0c;maven的dependency插件可以帮我们做这件事情。 我们需要在pom文件的build节点的plugins节点内添加一个plugin&#xff0c;plugin内容如下&#xff1a; <p…

计算机应用基础制作培训通知,计算机应用基础 机号-姓名-任务3制作培训报名流程图.docx...

XX省XX市教育局XXX办发【2013】008号关于举办多媒体课件设计制作培训班的通知为了适应时代的需要&#xff0c;为了推广多媒体教学&#xff0c;使每位教师能熟练运用多媒体进行教学&#xff0c;经研究&#xff0c;特举办多媒体课件设计与制作培训班&#xff0c;提高教师多媒体课…

MVC中 使用带参数的Action渲染部分视图

主视图&#xff1a;AddSingleChoice.cshtml 用来添加题目 部分试图&#xff1a;_AddedSingleChoice.cshtml 当在主视图中添加题目后&#xff0c;将此部分视图嵌入主视图&#xff0c;并用这个部分视图来显然已经添加的题目 因为项目中的具体要求是只显示属于当前单元的题目&…

hdfs 进入文件夹_05646.1.0HDFS超级用户(Superuser)和HDFS管理员(Administrator)的区别

温馨提示&#xff1a;如果使用电脑查看图片不清晰&#xff0c;可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github&#xff1a;https://github.com/fayson/cdhproject提示&#xff1a;代码块部分可以左右滑动查看噢1文档编写目的在前面的文章《0550-6.1-如何…

计算机学校包分配吗,兴国今年初中毕业学计算机哪所学校包分配

兴国今年初中毕业学计算机哪所学校包分配,xnakva。兴国今年初中毕业学计算机哪所学校包分配小编总结看过兴国中等开设的以后&#xff0c;同学们有没有找到自己喜欢的呢我们可以看到兴国中等的都是当下比较热门的&#xff0c;包括有学前教育、数控应用、汽车应用与维修、电子应用…

什么是RST包,什么是三次握手,什么是四次握手 ---请进

一、RST包、本人学习后总结&#xff1a;RST包用于强制关闭TCP链接。 TCP连接关闭的正常方法是四次握手。但四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意&#xff0c;由于RST包不是TCP连接中的…

int数组最多多少个元素_3.9数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)...

3.9数组3.9.1数组基本使用数组&#xff0c;英文叫Array&#xff0c;是一种数据结构&#xff0c;是用来存放同一数据类型数值的集合。例如存放30个int型数值、存放100个double型数值等等。我们知道使用一个变量&#xff0c;需要先声明一个变量&#xff0c;例如&#xff1a;int a…

table 修改

转载于:https://www.cnblogs.com/linbinqiang/p/4975136.html