HDU 1402 A * B Problem Plus 快速傅里叶变换 FFT 多项式
http://acm.hdu.edu.cn/showproblem.php?pid=1402
快速傅里叶变换优化的高精度乘法。
https://blog.csdn.net/ggn_2015/article/details/68922404 这个写的很详细了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
#include<complex>
using namespace std;
#define LL long long
const int maxn=;
typedef complex< double >cd;
char s1[maxn]={},s2[maxn]={};
int ans[maxn]={};
int rev[maxn]={}; int s,bit;
cd a[maxn]={},b[maxn]={};
double Pi;
inline void getrev(){ for(int i=;i<s;i++)rev[i]=(rev[i>>]>>)|((i&)<<(bit-)); }
inline void fft(cd *c,int n,int dft){
for(int i=;i<=s;i++)if(rev[i]>i)swap(c[i],c[rev[i]]);
for(int step=;step<n;step<<=){
cd shu=exp(cd(,dft*Pi/step));
for(int i=;i<n;i+=step<<){
cd z=cd(,);
for(int j=i;j<i+step;j++){
cd x=c[j];cd y=c[j+step]*z;
c[j]=x+y; c[j+step]=x-y;
z*=shu;
}
}
}
if(dft==-)for(int i=;i<n;i++)c[i]/=n;
}
int main(){
cd cle(,);Pi=2.0*acos(0.0);
while(~scanf("%s%s",s1,s2)){
memset(rev,,sizeof(rev));
int l1=strlen(s1),l2=strlen(s2),n=l1+l2-;
bit=;s=; for(;s<n;++bit)s<<=;
getrev();
for(int i=;i<=s;i++){a[i]=cle;b[i]=cle;}
for(int i=;i<l1;i++)a[i]=(double)(s1[l1-i-]-'');
for(int i=;i<l2;i++)b[i]=(double)(s2[l2-i-]-'');
fft(a,s,);fft(b,s,);
for(int i=;i<s;i++)a[i]*=b[i];
fft(a,s,-);
memset(ans,,sizeof(ans));
for(int i=;i<s;i++){
ans[i]+=(int)(a[i].real()+0.5);
ans[i+]+=ans[i]/;
ans[i]%=;
}
int i;
for(i=l1+l2;!ans[i]&&i>;--i);
if(i==)printf("%d\n",ans[]);
else{
for(;i>=;--i)printf("%d",ans[i]);
printf("\n");
}
}
return ;
}
HDU 1402 A * B Problem Plus 快速傅里叶变换 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
/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...
- 快速傅里叶变换FFT
多项式乘法 #include <cstdio> #include <cmath> #include <algorithm> #include <cstdlib ...
- [学习笔记] 多项式与快速傅里叶变换(FFT)基础
引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积, 而代码量却非常小. 博主一年半前曾经因COGS的一 ...
- 快速傅里叶变换FFT& 数论变换NTT
相关知识 时间域上的函数f(t)经过傅里叶变换(Fourier Transform)变成频率域上的F(w),也就是用一些不同频率正弦曲线的加 权叠加得到时间域上的信号. \[ F(\omega)=\m ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
- 快速傅里叶变换(FFT)
扯 去北京学习的时候才系统的学习了一下卷积,当时整理了这个笔记的大部分.后来就一直放着忘了写完.直到今天都腊月二十八了,才想起来还有个FFT的笔记没整完呢.整理完这个我就假装今年的任务全都over了吧 ...
- 快速傅里叶变换(FFT)_转载
FFTFFT·Fast Fourier TransformationFast Fourier Transformation快速傅立叶变换 P3803 [模板]多项式乘法(FFT) 参考上文 首 ...
- 基于python的快速傅里叶变换FFT(二)
基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点 FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...
随机推荐
- P3959 宝藏
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的 mm 条道路和它们的长度. 小明决心亲自前往挖掘 ...
- Scala进阶之路-Scala的基本语法
Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- python---django使用cookie和session
在views中的调用: def login(req): message='' if req.method == "POST": user = req.POST.get(" ...
- c#:无法将 NULL 转换成“System.DateTime”,因为它是一种值类型
摘自:http://www.blogjava.net/parable-myth/archive/2010/09/30/333454.html 在C# 2.0里面的数据类型中,分为值类型和引用类型,引用 ...
- Codeforces 338 D. GCD Table
http://codeforces.com/problemset/problem/338/D 题意: 有一张n*m的表格,其中第i行第j列的数为gcd(i,j) 给出k个数 问在这张表格中是否 有某一 ...
- 【整理】HTML5游戏开发学习笔记(3)- 抛物线运动
1.预备知识(1)Canvas旋转的实现过程 window.onload = function(){ var ctx = document.getElementById('canvas1').getC ...
- Jad查看源码
需要者两个文件:下载地址:http://pan.baidu.com/s/11qq4I 1,解压jar包 有两个文件 分别是net.sf.jadclipse_3.3.0 jad.exe 文件 2,找到m ...
- linux 查看有哪些service
一.利用进程来查看命令里 ps -aux | grep xxx 是查看某个进程或者服务是否存在.二.利用chkconfig配置工具chkconfig --list 可以列出所有的服务在各个runlev ...
- MySQL删除数据后磁盘空间的释放情况【转】
OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE TABLE 是指对表进行优化.如果已经删除 ...