【HDU 1402】A * B Problem Plus(FFT)
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)的更多相关文章
- 【BZOJ 2298】 2298: [HAOI2011]problem a (DP)
2298: [HAOI2011]problem a Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1326 Solved: 637 Descript ...
- Luogu1919 【模板】A*B Problem升级版(FFT)
简单的\(A*B\) \(Problem\),卡精度卡到想女装 #include <iostream> #include <cstdio> #include <cstri ...
- 【Luogu1919】 A*B Problem升级版(FFT)
题面戳我 题解 把每个数都直接看做一个多项式,每一位就是一项 现在求用FFT求出卷积 然后考虑一下进位就可以啦 #include<iostream> #include<cstdio& ...
- 洛谷P1919 【模板】A*B Problem升级版(FFT)
传送门 话说FFT该不会真的只能用来做这种板子吧…… 我们把两个数字的每一位都看作多项式的系数 然后这就是一个多项式乘法 上FFT就好了 然后去掉前导零 (然而连FFT的板子都背不来orz,而且空间又 ...
- 【BZOJ 4503】4503: 两个串 (FFT)
4503: 两个串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 497 Solved: 226 Description 兔子们在玩两个串的游戏.给 ...
- 【Unity3D实战】摇摆直升机开发实战(一)
[Unity3D实战]摇摆直升机开发实战(一) 1.点击[Assets],创建[Sprites]和[Resources]文件夹,然后将所需要的素材导入[Sprites]文件夹中. 2.找到[Sprit ...
- 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)
题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...
- 【详解】ThreadPoolExecutor源码阅读(三)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) 线程数量的 ...
- 【详解】ThreadPoolExecutor源码阅读(二)
系列目录 [详解]ThreadPoolExecutor源码阅读(一) [详解]ThreadPoolExecutor源码阅读(二) [详解]ThreadPoolExecutor源码阅读(三) AQS在W ...
随机推荐
- UvalLive4670(AC自动机模板)
放上刘汝佳的模板: #include <cstdio> #include <cstring> #include <string> #include <algo ...
- Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...
- LCA+树状数组 POJ 2763 Housewife Wind
题目传送门 题意:两种操作,问u到v的距离,并且u走到了v:把第i条边距离改成w 分析:根据DFS访问顺序,将树处理成链状的,那么回边处理成负权值,那么LCA加上BIT能够知道u到v的距离,BIT存储 ...
- 019 [工具软件]窗体置顶 DeskPins
DeskPins:Windows下将任何窗体置顶的工具 官方主页:https://efotinis.neocities.org/deskpins/index.html 官方下载的是一个exe安装包,用 ...
- 文件共享服务 FTP,NFS 和 Samba
DAS DAS 指 Direct Attached Storage,即直连附加存储,这种设备直接连接到计算机主板总线上,计算机将其识别为一个块设备,例如常见的硬盘,U 盘等,这种设备很难做到共享. N ...
- v-bind和v-on
v-bind指令用于设置HTML属性:v-bind:href 缩写为 :href <a :href="{{url}}">aa</a> v-on 指令用于绑 ...
- android开发学习 ------- 枚举类型在Android中的用法
一般上为了简化代码,重用代码,设置标志位来表示不同的流程,这个标志位可以使用枚举类型来表示: 1:定义 public FbManner fbManer = FbManner.EMAIL; //给一个默 ...
- 微服务熔断限流Hystrix之流聚合
简介 上一篇介绍了 Hystrix Dashboard 监控单体应用的例子,在生产环境中,监控的应用往往是一个集群,我们需要将每个实例的监控信息聚合起来分析,这就用到了 Turbine 工具.Turb ...
- 作用域链、this细说
一.作用域链 作用域:浏览器给js的一个生存环境(栈内存) 作用域链:js中的关键字var和function 都可以提前声明和定义,提前声明和定义的放在我们的内存地址(堆内存)中.然后js从上到下逐行 ...
- canvas基础绘制-绚丽时钟
效果图: 与canvas基础绘制-绚丽倒计时的代码差异: // var endTime = new Date();//const声明变量,不可修改,必须声明时赋值: // endTime.setTim ...