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)相关推荐

  1. POJ 2389 Bull Math(水~Java -大数相乘)

    题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: 1 import java. ...

  2. POJ 2389 Bull Math(大数乘大数)

    Description Bulls are so much better at math than the cows. They can multiply huge integers together ...

  3. 快速傅里叶变换(FFT)的C#实现及详细注释

    快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...

  4. 【学习笔记】超简单的快速傅里叶变换(FFT)(含全套证明)

    整理的算法模板合集: ACM模板 目录 一.概念概述 二.前置知识 1. 多项式 2. 复数 4. 欧拉公式证明 3. 复数的单位根 / 单位向量 三.FFT 算法概述 四.离散傅里叶变换(DFT) ...

  5. JavaScript强化教程——JavaScript Math(算数) 对象

    为什么80%的码农都做不了架构师?>>>    本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 -- JavaScript Math(算数 ...

  6. 快速傅里叶变换_计算物理基础:第八章-快速傅里叶变换(FFT)

    参考北京师范大学的<计算物理基础> 第八章-快速傅里叶变换 计算物理基础_中国大学MOOC(慕课)​www.icourse163.org 1.快速傅里叶变换 1.1 离散傅里叶变换及其变换 ...

  7. 快速傅里叶变换(FFT)详解

    快速傅里叶变换(FFT)详解 (这是我第一次写博,不喜勿喷...) 关于FFT已经听闻已久了,这次终于有机会在Function2的介绍下来了解一下FFT了. 快速傅里叶变换(Fast Fourier ...

  8. P3803 【模板】多项式乘法(FFT)

    P3803 [模板]多项式乘法(FFT) 题目描述 给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x). 请求出 F(x)和 G(x)的卷积. 从低到高输出F(x)*G(x)的系数 另一 ...

  9. 11.频域里的卷积——介绍,傅里叶变换和卷积,快速傅里叶变换(FFT)_1

    目录 介绍 傅里叶变换和卷积 FFT 介绍 我们将继续讨论频率分析以及如何用频率分量的概念来研究图像.如果你还记得上次我们讲过的基于频率的图像分解的概念.我们通过给你们看这张照片来回忆它(如图).这是 ...

最新文章

  1. [ASP.NET]状态管理[摘自C#入门经典]
  2. 每日一皮:两个实习生的结对编程...
  3. 采用vue-cli安装的一些注意点
  4. 使用canvas元素和JavaScript花费您的星期日(或任何一天)。
  5. TensorFlow应用实战-17-Qlearning实现迷宫小游戏
  6. 1分钟完美安装最新 CentOS + Nginx + PHP-FPM + MySQL
  7. springboot细节挖掘(知识积累)
  8. MySQL无法启动 服务没有报告任何错误
  9. android工程的建立,第一个Android项目HelloWorld的建立及剖析
  10. 移动端触屏滑动touches使用
  11. 在函数中如何获取 线程对象、线程唯一ID
  12. 卡巴斯基7.0简体中文下载【有2010年的授权文件】
  13. 联想Y9000P2021双SSD系统win10下ubantu20.04+ROS的安装(记录非教程)
  14. Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix
  15. 清华机试真题:成绩排序
  16. php adodb smarty,ADODB结合SMARTY使用~超级强
  17. git 版本管理系统
  18. ‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  19. Mandriva下载
  20. QCC300x笔记(0)-- 系列博文索引

热门文章

  1. jar命令查看查找搜索 jar, war 文件内容
  2. 对于初学者怎么画古风男性眼睛?该怎么画?
  3. Shader之——花草动画shader
  4. 短说正式版V3.7.4发布【新增悬赏问答、打赏、付费看帖、IP属地】
  5. opencv 利用摄像头来判断石头剪刀布的小游戏
  6. windows播放wav音频文件
  7. 购买掌上电脑的三大理由[转贴]
  8. RK3399的Ubuntu计算机安装使用
  9. RK3399安装Ubuntu
  10. Android FFmpeg 转换MP3格式