POJ 2389 Bull Math(FFT)
Description
给出两个数A和B,求A*B
Input
两个数字串,串长均不超过40
Output
输出两个串所表示数字的乘积
Sample Input
11111111111111
1111111111
Sample Output
12345679011110987654321
Solution
可以直接暴力模拟高精度乘法,也可以用FFT加速
Code
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 70
const double pi=acos(-1.0);
struct cp
{double a,b;cp operator +(const cp &o)const {return (cp){a+o.a,b+o.b};}cp operator -(const cp &o)const {return (cp){a-o.a,b-o.b};}cp operator *(const cp &o)const {return (cp){a*o.a-b*o.b,b*o.a+a*o.b};}cp operator *(const double &o)const {return (cp){a*o,b*o};}cp operator !() const{return (cp){a,-b};}
}w[maxn];
int pos[maxn];
void fft_init(int len)
{int j=0;while((1<<j)<len)j++;j--;for(int i=0;i<len;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
}
void fft(cp *x,int len,int sta)
{for(int i=0;i<len;i++)if(i<pos[i])swap(x[i],x[pos[i]]);w[0]=(cp){1,0};for(unsigned i=2;i<=len;i<<=1){cp g=(cp){cos(2*pi/i),sin(2*pi/i)*sta};for(int j=i>>1;j>=0;j-=2)w[j]=w[j>>1];for(int j=1;j<i>>1;j+=2)w[j]=w[j-1]*g;for(int j=0;j<len;j+=i){cp *a=x+j,*b=a+(i>>1);for(int l=0;l<i>>1;l++){cp o=b[l]*w[l];b[l]=a[l]-o;a[l]=a[l]+o;}}}if(sta==-1)for(int i=0;i<len;i++)x[i].a/=len,x[i].b/=len;
}
cp x[maxn],y[maxn],z[maxn];
void FFT(int *a,int *b,int n,int m,int *c)
{int len=1;while(len<=(n+m)>>1)len<<=1;fft_init(len);for(int i=n/2;i<len;i++)x[i].a=x[i].b=0;for(int i=m/2;i<len;i++)y[i].a=y[i].b=0;for(int i=0;i<n;i++)(i&1?x[i>>1].b:x[i>>1].a)=a[i];for(int i=0;i<m;i++)(i&1?y[i>>1].b:y[i>>1].a)=b[i];fft(x,len,1),fft(y,len,1);for(int i=0;i<len/2;i++){int j=len-1&len-i;z[i]=x[i]*y[i]-(x[i]-!x[j])*(y[i]-!y[j])*(w[i]+(cp){1,0})*0.25;}for(int i=len/2;i<len;i++){int j=len-1&len-i;z[i]=x[i]*y[i]-(x[i]-!x[j])*(y[i]-!y[j])*((cp){1,0}-w[i^len>>1])*0.25;}fft(z,len,-1);for(int i=0;i<n+m;i++)if(i&1)c[i]=(int)(z[i>>1].b+0.5);else c[i]=(int)(z[i>>1].a+0.5);
}
char s1[maxn],s2[maxn];
int a[maxn],b[maxn],c[maxn<<1];
int main()
{while(~scanf("%s%s",s1,s2)){memset(c,0,sizeof(c));int n=strlen(s1),m=strlen(s2);for(int i=0;i<n;i++)a[i]=s1[n-1-i]-'0';for(int i=0;i<m;i++)b[i]=s2[m-1-i]-'0';FFT(a,b,n,m,c);for(int i=0;i<n+m-1;i++){c[i+1]+=c[i]/10;c[i]%=10;}int len=n+m-1;while(c[len]==0&&len>0)len--;for(int i=len;i>=0;i--)printf("%c",c[i]+'0');printf("\n");}return 0;
}
POJ 2389 Bull Math(FFT)相关推荐
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: 1 import java. ...
- POJ 2389 Bull Math(大数乘大数)
Description Bulls are so much better at math than the cows. They can multiply huge integers together ...
- 快速傅里叶变换(FFT)的C#实现及详细注释
快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...
- 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)
整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...
- JavaScript强化教程——JavaScript Math(算数) 对象
为什么80%的码农都做不了架构师?>>> 本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 -- JavaScript Math(算数 ...
- 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)
参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...
- 快速傅里叶变换(FFT)详解
快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...
- P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x). 请求出 F(x)和 G(x)的卷积. 从低到高输出F(x)*G(x)的系数 另一 ...
- 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1
目录 介绍 傅里叶变换和卷积 FFT 介绍 我们将继续讨论频率分析以及如何用频率分量的概念来研究图像.如果你还记得上次我们讲过的基于频率的图像分解的概念.我们通过给你们看这张照片来回忆它(如图).这是 ...
最新文章
- [ASP.NET]状态管理[摘自C#入门经典]
- 每日一皮:两个实习生的结对编程...
- 采用vue-cli安装的一些注意点
- 使用canvas元素和JavaScript花费您的星期日(或任何一天)。
- TensorFlow应用实战-17-Qlearning实现迷宫小游戏
- 1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL
- springboot细节挖掘(知识积累)
- MySQL无法启动 服务没有报告任何错误
- android工程的建立,第一个Android项目HelloWorld的建立及剖析
- 移动端触屏滑动touches使用
- 在函数中如何获取 线程对象、线程唯一ID
- 卡巴斯基7.0简体中文下载【有2010年的授权文件】
- 联想Y9000P2021双SSD系统win10下ubantu20.04+ROS的安装(记录非教程)
- Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix
- 清华机试真题:成绩排序
- php adodb smarty,ADODB结合SMARTY使用~超级强
- git 版本管理系统
- ‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- Mandriva下载
- QCC300x笔记(0)-- 系列博文索引