FFT教你做乘法(FFT傅里叶变换)
题目来源:https://biancheng.love/contest/41/problem/C/index
FFT教你做乘法
题目描述
给定两个8进制正整数A和B(A和B均小于10000位),请利用离散傅里叶变换计算A与B的乘积。
输入
多组测试数据(组数不超过100)每组测试数据只有一行,包含两个正整数A和B。
输出
对于每组数据,输出一行,为A和B的乘积。
输入样例
1 7
2 17
输出样例
7
36
解题思路:
推荐博客(有助于理解FFT):http://blog.jobbole.com/58246/
推荐博客(FFT之大数相乘):http://www.cnblogs.com/lsx54321/archive/2012/07/20/2601632.html给出代码:
#include <bits/stdc++.h>
#define N 505050 using namespace std; const double PI=acos(-1.0);
struct Vir
{
double re,im;
Vir(double _re=.,double _im=.):re(_re),im(_im) {}
Vir operator*(Vir r)
{
return Vir(re*r.re-im*r.im,re*r.im+im*r.re);
}
Vir operator+(Vir r)
{
return Vir(re+r.re,im+r.im);
}
Vir operator-(Vir r)
{
return Vir(re-r.re,im-r.im);
}
}; void bit_rev(Vir *a,int loglen,int len)
{
for(int i=; i<len; ++i)
{
int t=i,p=;
for(int j=; j<loglen; ++j)
{
p<<=;
p=p|(t&);
t>>=;
}
if(p<i)
{
Vir temp=a[p];
a[p]=a[i];
a[i]=temp;
}
}
}
void FFT(Vir *a,int loglen,int len,int on)
{
bit_rev(a,loglen,len); for(int s=,m=; s<=loglen; ++s,m<<=)
{
Vir wn=Vir(cos(*PI*on/m),sin(*PI*on/m));
for(int i=; i<len; i+=m)
{
Vir w=Vir(1.0,);
for(int j=; j<m/; ++j)
{
Vir u=a[i+j];
Vir v=w*a[i+j+m/];
a[i+j]=u+v;
a[i+j+m/]=u-v;
w=w*wn;
}
}
}
if(on==-)
{
for(int i=; i<len; ++i) a[i].re/=len,a[i].im/=len;
}
}
char a[N*],b[N*];
Vir pa[N*],pb[N*];
int ans[N*]; int main ()
{
while(scanf("%s%s",a,b)!=EOF)
{
int lena=strlen(a);
int lenb=strlen(b);
int n=,loglen=;
while(n<lena+lenb)
{
n<<=,loglen++;
}
for(int i=,j=lena-; i<n; ++i,--j)
pa[i]=Vir(j>=?a[j]-'':.,.);
for(int i=,j=lenb-; i<n; ++i,--j)
pb[i]=Vir(j>=?b[j]-'':.,.);
for(int i=; i<=n; ++i)
{
ans[i]=;
}
FFT(pa,loglen,n,);
FFT(pb,loglen,n,);
for(int i=; i<n; ++i)
pa[i]=pa[i]*pb[i];
FFT(pa,loglen,n,-); for(int i=; i<n; ++i) ans[i]=pa[i].re+0.5;
for(int i=; i<n; ++i) ans[i+]+=ans[i]/,ans[i]%=; int pos=lena+lenb-;
for(; pos>&&ans[pos]<=; --pos) ;
for(; pos>=; --pos) printf("%d",ans[pos]);
printf("\n");
}
return ;
}
FFT教你做乘法(FFT傅里叶变换)的更多相关文章
- @总结 - 1@ 多项式乘法 —— FFT
目录 @0 - 参考资料@ @1 - 一些概念@ @2 - 傅里叶正变换@ @3 - 傅里叶逆变换@ @4 - 迭代实现 FFT@ @5 - 参考代码实现@ @6 - 快速数论变换 NTT@ @7 - ...
- FFT模板(多项式乘法)
FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ...
- 多项式乘法(FFT)学习笔记
------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法 ...
- FFT用于高效大数乘法(当模板用)
转载来源:https://blog.csdn.net/zj_whu/article/details/72954766 #include <cstdio> #include <cmat ...
- 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘
链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...
- NC23046 华华教月月做数学
NC23046 华华教月月做数学 题目 题目描述 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽快和月月继续聊天,就提出帮她做一部分作业. 月月 ...
- UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包
背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...
- 3分钟教你做一个iphone手机浏览器
3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...
- 转载:手把手教你做iOS推送
手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html
随机推荐
- EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C
首先介绍下这3个文件的关系:可以说INPUT1.C的函数粒度最大,它的函数getdata()就完成了整个INPUT文件数据的读入,该函数又调用了INPUT2.C中的部分函数,INPUT2.C文件中的函 ...
- JAVA jdbc(数据库连接池)学习笔记(二) SQL注入
PS:今天偶然间发现了SQL的注入...所以就简单的脑补了一下,都是一些简单的例子...这篇写的不怎么样...由于自己没有进行很深的研究... 学习内容: 1.SQL注入的概念... 所谓SQL注 ...
- ASP.NET 文件上传类 简单好用
调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...
- Entity Framework优缺点及使用方法总结
Entity Framework是M$提供的一个ORM框架,它旨在为小型应用程序中数据层的快速开发提供便利. nuget上185W多的下载量,说明.Net开发人员还是比较喜欢用EF的.但是EF在提供了 ...
- Spring基础——在 IOC 容器中 Bean 之间的关系
一.在 Spring IOC 容器中 Bean 之间存在继承和依赖关系. 需要注意的是,这个继承和依赖指的是 bean 的配置之间的关系,而不是指实际意义上类与类之间的继承与依赖,它们不是一个概念. ...
- 使用SignalR构建一个最基本的web聊天室
What is SignalR ASP.NET SignalR is a new library for ASP.NET developers that simplifies the process ...
- Linux - Ubuntu下JDK配置
系统版本: ubuntu 14.04 x64JDK版本: jdk-8u60-linux-x64 1.查看系统位数,输入以下命令即可 getconf LONG_BIT 2.下载对应的JDK文件,我这里下 ...
- AEAI WM V1.0 工作管理系统开源发版
AEAI WM工作管理系统是沈阳数通畅联软件公司基于AEAI DP平台开发的开源Java Web系统,用来管理记录日常工作内容及周工作内容等事务,AEAI WM工作管理系统包括一些核心的工作管理业务功 ...
- 周末web前端练习
在 CSS 样式定义中,以下哪种 RGB 颜色值是 Web 安全色? A]#111111B]#222222C]#333333D]#444444 答案:http://hovertree.com/ti ...
- knockout的依赖属性dependentObservable和observable的监控的使用
1.Knockout是在下面三个核心功能是建立起来的:监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模 ...