Calculate A * B.

Input

Each line will contain two integers A and B. Process to end of file.

Note: the length of each integer will not exceed 50000.

Output

For each case, output A * B in one line.

Sample Input

1
2
1000
2

Sample Output

2
2000
  
  唉,模板题,膜的邝斌的模板。
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const double PI = acos(-1.0); struct complex{
double r,i;
complex(double r_=0.0,double i_=0.0)
{
r=r_;i=i_;
}
complex operator +(const complex &b)
{
return complex(r+b.r,i+b.i);
}
complex operator -(const complex &b)
{
return complex(r-b.r,i-b.i);
}
complex operator *(const complex &b)
{
return complex(r*b.r-i*b.i,i*b.r+r*b.i);
}
}; void Rader(complex *a,int len)
{
int k;
for(int i=,j=len/;i<len-;i++)
{
if(i<j)swap(a[i],a[j]);
k=len/;
while(j>=k)
{
j-=k;
k>>=;
}
j+=k;
}
} void FFT(complex *a,int len,int on)
{
Rader(a,len);
for(int h=;h<=len;h<<=)
{
complex wn(cos(-on**PI/h),sin(-on**PI/h));
for(int j=;j<len;j+=h)
{
complex w(,);
for(int k=j;k<j+h/;k++)
{
complex u=a[k];
complex v=a[k+h/]*w;
a[k]=u+v;
a[k+h/]=u-v;
w=w*wn;
}
}
}
if(on==-)
for(int i=;i<len;i++)
a[i].r/=len;
} const int maxn = ;
complex Array1[maxn],Array2[maxn];
char str1[maxn],str2[maxn];
int sum[maxn],len,len1,len2; int main()
{
while(~scanf("%s%s",str1,str2))
{
len1=strlen(str1);
len2=strlen(str2);
len=;
while(len<len1*||len<len2*)len<<=;
for(int i=;i<len1;i++)
Array1[i]=complex(str1[len1-i-]-'',);
for(int i=;i<len2;i++)
Array2[i]=complex(str2[len2-i-]-'',); for(int i=len1;i<len;i++)
Array1[i]=complex(,);
for(int i=len2;i<len;i++)
Array2[i]=complex(,); FFT(Array1,len,);
FFT(Array2,len,);
for(int i=;i<len;i++)
Array1[i]=Array1[i]*Array2[i];
FFT(Array1,len,-);
memset(sum,,sizeof(sum));
for(int i=;i<len;i++){
sum[i]+=(int)(Array1[i].r+0.5);
sum[i+]+=sum[i]/;
sum[i]%=;
}
int p=len;
while(!sum[p]&&p)p--;
for(;p!=-;p--)
printf("%d",sum[p]);
printf("\n");
}
return ;
}

  两个月后重打了一遍。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=;
const double PI=acos(-1.0);
struct complex{
double r,i;
complex(double r_=0.0,double i_=0.0){
r=r_;i=i_;
}
complex operator +(complex a){
return complex(r+a.r,i+a.i);
}
complex operator -(complex a){
return complex(r-a.r,i-a.i);
}
complex operator *(complex a){
return complex(r*a.r-i*a.i,r*a.i+a.r*i);
}
}A[maxn],B[maxn]; void Rader(complex *a,int len){
int k;
for(int i=,j=len>>;i<len-;i++){
if(i<j)swap(a[i],a[j]);
k=len>>;
while(j>=k){
j-=k;
k>>=;
}
j+=k;
}
} void FFT(complex *a,int len,int on){
Rader(a,len);
for(int h=;h<=len;h<<=){
complex wn(cos(-on*PI*2.0/h),sin(-on*PI*2.0/h));
for(int j=;j<len;j+=h){
complex w(,);
for(int k=j;k<j+(h>>);k++){
complex x=a[k];
complex y=a[k+(h>>)]*w;
a[k]=x+y;
a[k+(h>>)]=x-y;
w=w*wn;
}
}
}
if(on==-)
for(int i=;i<len;i++)
a[i].r/=len;
return;
} char s[maxn],t[maxn];
int ans[maxn];
int main(){
while(~scanf("%s%s",s,t)){
int lens=strlen(s);
int lent=strlen(t),len=;
while(len<=lens+lent)len<<=;
memset(A,,sizeof(A));
memset(B,,sizeof(B));
for(int i=;i<lens;i++)
A[i].r=1.0*(s[lens-i-]-'');
for(int i=;i<lent;i++)
B[i].r=1.0*(t[lent-i-]-'');
FFT(A,len,);FFT(B,len,);
for(int i=;i<len;i++)
A[i]=A[i]*B[i];
FFT(A,len,-); memset(ans,,sizeof(ans));
int in=;
for(int i=;i<len;i++){
ans[i]=in+floor(A[i].r+0.5);
in=ans[i]/;
ans[i]%=;
}
int i;
for(i=len;i&&!ans[i];i--);
while(~i)printf("%d",ans[i]),i--;
printf("\n");
}
return ;
}

FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus的更多相关文章

  1. 快速傅立叶变换&HDU 1402

    参考http://www.cnblogs.com/v-July-v/archive/2011/08/13/2214132.html <算导> 那么,更快速的多项式乘法就依赖于能否把一个系数 ...

  2. FFT快速傅立叶变换的工作原理

    实数DFT,复数DFT,FFTFFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换 ...

  3. spoj VFMUL FFT快速傅立叶变换模板题

    题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...

  4. FFT快速傅立叶变换

    //最近突然发现博客园支持\(\rm\LaTeX\),非常高兴啊! 话说离省选只有不到五天了还在学新东西确实有点逗…… 切到正题,FFT还是非常神奇的一个东西,能够反直觉地把两个多项式相乘的时间复杂度 ...

  5. FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain

    您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:

  6. 离散傅立叶变换与快速傅立叶变换(DFT与FFT)

    自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...

  7. 快速傅立叶变换(FFT)算法

    已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...

  8. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  9. BZOJ 2194 快速傅立叶变换之二 | FFT

    BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...

随机推荐

  1. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  2. codevs 3044 矩形面积求并 (扫描线)

    /* 之前一直偷懒离散化+暴力做着题 今天搞一下扫描线 自己按照线段树的一般写法写的有些问题 因为不用于以前的区间sum so 题解搬运者23333 Orz~ 去掉了打标记的过程 同时更新区间的时候先 ...

  3. 用户组,AD域控简介

    “自由”的工作组    工作组(WORK GROUP)就是将不同的电脑按功能分别列入不同的组中,以方便管理.比如在一个网络内,可能有成百上千台工作电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可 ...

  4. html招聘简历解析并入库测试

    1.解析4天,一天用来熟悉Jsoup 2.入库,需要熟悉什么样的格式代码可以入库,将自己解析好的代码转为指定格式.总体框架的构建, 如何执行,需要读他人写的代码(很费时间).4天,包括晚上九点加班三天 ...

  5. iOS_ruby环境的配置

    AC机中安装RUBY环境  转自:http://www.cnblogs.com/foxting/p/4520829.html 在安装CocoaPods之前要先配置好RUBY环境,本文就怎么安装RUBY ...

  6. ios里面如何压缩图片

    在iOS里面,压缩图片跟在其他环境里面差不多,都和累死, 就是对当前图片从新画图,制定一个尺寸的问题 UIImage* image = [UIImage imageNamed:@"cat.j ...

  7. 342. Power of Four

    题目: Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example ...

  8. centos中文乱码修改字符编码使用centos支持中文

    如何你的centos显示中文乱码,只要修改字符编码使centos支持中文就可以了,没有这个文件可以创建它,下面是修改步骤 一.中文支持 安装中文语言包: 复制代码 代码如下: yum groupins ...

  9. nodejs版本控制

    本方法基于https://segmentfault.com/a/1190000004855835修改 配置: 使用的nvmw的git 地址https://github.com/hakobera/nvm ...

  10. 基于BitNami for XAMPP进行Drupal7安装的教程(Win7平台)

    BitNami是一个开源项目,该项目产生的开源软件包可用于安装Web应用程序和解决方案堆栈,以及虚拟设备.BitNami 提供wordpress.joomla.drupal.bbpress等开源程序的 ...