Problem Description


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

题解


做卷积主要思想是,先把系数表达式转化为点值表达式,而点值表达式相乘的时间复杂度是\(O(n)\)的,唯一需要优化的是这个转化的过程,需要使用fft进行优化,时间负责度可以降为\(O(nlogn)\),具体算法思想参看

资料:http://blog.csdn.net/iamzky/article/details/22712347

参考代码

#include <queue>
#include <cmath>
#include <cstdio>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define inf 1000000000
#define PI acos(-1)
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void Out(ll a){
if(a<0) putchar('-'),a=-a;
if(a>=10) Out(a/10);
putchar(a%10+'0');
}
const int N=200005;
typedef complex<double> E;
E a[N],b[N],A[N],c[N];
char s1[N],s2[N];
int sum[N],a1[N],a2[N],dig[N],rev[N];
void FFT(E a[],int n,int flag){
E x,y;
for(int i=0;i<n;i++) A[i]=a[rev[i]];
for(int i=0;i<n;i++) a[i]=A[i];
for(int i=2;i<=n;i<<=1){
E wn(cos(2*PI/i),flag*sin(2*PI/i));
for(int k=0;k<n;k+=i){
E w(1,0);
for(int j=k;j<k+i/2;j++){
x=a[j];
y=a[j+i/2]*w;
a[j]=x+y;
a[j+i/2]=x-y;
w=w*wn;
}
}
}
if(flag==-1) for(int i=0;i<n;i++) a[i]/=n;
}
int main(){
while(~scanf("%s%s",s1,s2)){
int len1=strlen(s1),len2=strlen(s2),n,L;
for(n=1,L=0;n<max(len1,len2);n<<=1,L++);
n<<=1;L++;
mem(rev,0);mem(dig,0);
mem(a1,0);mem(a2,0);
for(int i=0;i<n;i++){
int len=0;
for(int t=i;t;t>>=1) dig[len++]=t&1;
for(int j=0;j<L;j++) rev[i]=(rev[i]<<1)|dig[j];
}
for(int i=0;i<len1;i++) a1[len1-i-1]=s1[i]-'0';
for(int i=0;i<len2;i++) a2[len2-i-1]=s2[i]-'0';
for(int i=0;i<n;i++) a[i]=E(a1[i]);
for(int i=0;i<n;i++) b[i]=E(a2[i]);
FFT(a,n,1);FFT(b,n,1);
for(int i=0;i<n;i++) c[i]=a[i]*b[i];
FFT(c,n,-1);
for(int i=0;i<n;i++) sum[i]=c[i].real()+0.5;
for(int i=0;i<n;i++){
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}
int l=len1+len2-1;
while(sum[l]==0&&l>0)l--;
for(int i=l;i>=0;i--)
putchar(sum[i]+'0');
putchar('\n');
}
return 0;
}

【HDU 1402】A * B Problem Plus(FFT)的更多相关文章

  1. 【BZOJ 2298】 2298: [HAOI2011]problem a (DP)

    2298: [HAOI2011]problem a Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1326  Solved: 637 Descript ...

  2. Luogu1919 【模板】A*B Problem升级版(FFT)

    简单的\(A*B\) \(Problem\),卡精度卡到想女装 #include <iostream> #include <cstdio> #include <cstri ...

  3. 【Luogu1919】 A*B Problem升级版(FFT)

    题面戳我 题解 把每个数都直接看做一个多项式,每一位就是一项 现在求用FFT求出卷积 然后考虑一下进位就可以啦 #include<iostream> #include<cstdio& ...

  4. 洛谷P1919 【模板】A*B Problem升级版(FFT)

    传送门 话说FFT该不会真的只能用来做这种板子吧…… 我们把两个数字的每一位都看作多项式的系数 然后这就是一个多项式乘法 上FFT就好了 然后去掉前导零 (然而连FFT的板子都背不来orz,而且空间又 ...

  5. 【BZOJ 4503】4503: 两个串 (FFT)

    4503: 两个串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 497  Solved: 226 Description 兔子们在玩两个串的游戏.给 ...

  6. 【Unity3D实战】摇摆直升机开发实战(一)

    [Unity3D实战]摇摆直升机开发实战(一) 1.点击[Assets],创建[Sprites]和[Resources]文件夹,然后将所需要的素材导入[Sprites]文件夹中. 2.找到[Sprit ...

  7. 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)

    题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...

  8. 【详解】ThreadPoolExecutor源码阅读(三)

    系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...

  9. 【详解】ThreadPoolExecutor源码阅读(二)

    系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在W ...

随机推荐

  1. 跟我一起玩Win32开发(8):绘图(A)

    从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相 ...

  2. April Fools Contest 2017 A

    Description Input The input contains a single integer a (1 ≤ a ≤ 30). Output Output a single integer ...

  3. 简单几何(求交点) UVA 11178 Morley's Theorem

    题目传送门 题意:莫雷定理,求三个点的坐标 分析:训练指南P259,用到了求角度,向量旋转,求射线交点 /*********************************************** ...

  4. linux的目录结构详细介绍

    linux的目录结构详细介绍 1. /目录(根目录) 2./ect/目录 特定主机系统范围内的配置文件. 3./usr/目录 默认软件都会存于该目录下.用于存储只读用户数据的第二层次:包含绝大多数的用 ...

  5. 解决vue跨域问题

    package com.qmtt.config; import java.io.IOException; import javax.servlet.Filter; import javax.servl ...

  6. 【转】Android中实现IPC的几种方式详细分析及比较

    1.使用Bundle   ----> 用于android四大组件间的进程间通信android的四大组件都可使用Bundle传递数据  所以如果要实现四大组件间的进程间通信 完全可以使用Bundl ...

  7. Spring的校验(Validator)

    使用Spring校验的大体流程: 最首先要有配置文件xml的支持(spring_validate.xml).(当然在web.xml中要有对该xml的体现) <beans xmlns=" ...

  8. QQ面板拖拽(慕课网DOM事件探秘)(上)

    QQ面板拖拽,效果如图 JavaScript代码如下: function getByClass(clsName, parent) { var oParent = parent ? document.g ...

  9. 10道有关ios的题

    1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗? 2.你实现过多线程的Co ...

  10. 用Python爬取智联招聘信息做职业规划

    上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...