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. 1
  2. 2
  3. 1000
  4. 2

Sample Output

  1. 2
  2. 2000

题解


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

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

参考代码

  1. #include <queue>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <complex>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <iostream>
  8. #include <algorithm>
  9. #define ll long long
  10. #define inf 1000000000
  11. #define PI acos(-1)
  12. #define mem(a,x) memset(a,x,sizeof(a))
  13. using namespace std;
  14. ll read(){
  15. ll x=0,f=1;char ch=getchar();
  16. while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
  17. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  18. return x*f;
  19. }
  20. void Out(ll a){
  21. if(a<0) putchar('-'),a=-a;
  22. if(a>=10) Out(a/10);
  23. putchar(a%10+'0');
  24. }
  25. const int N=200005;
  26. typedef complex<double> E;
  27. E a[N],b[N],A[N],c[N];
  28. char s1[N],s2[N];
  29. int sum[N],a1[N],a2[N],dig[N],rev[N];
  30. void FFT(E a[],int n,int flag){
  31. E x,y;
  32. for(int i=0;i<n;i++) A[i]=a[rev[i]];
  33. for(int i=0;i<n;i++) a[i]=A[i];
  34. for(int i=2;i<=n;i<<=1){
  35. E wn(cos(2*PI/i),flag*sin(2*PI/i));
  36. for(int k=0;k<n;k+=i){
  37. E w(1,0);
  38. for(int j=k;j<k+i/2;j++){
  39. x=a[j];
  40. y=a[j+i/2]*w;
  41. a[j]=x+y;
  42. a[j+i/2]=x-y;
  43. w=w*wn;
  44. }
  45. }
  46. }
  47. if(flag==-1) for(int i=0;i<n;i++) a[i]/=n;
  48. }
  49. int main(){
  50. while(~scanf("%s%s",s1,s2)){
  51. int len1=strlen(s1),len2=strlen(s2),n,L;
  52. for(n=1,L=0;n<max(len1,len2);n<<=1,L++);
  53. n<<=1;L++;
  54. mem(rev,0);mem(dig,0);
  55. mem(a1,0);mem(a2,0);
  56. for(int i=0;i<n;i++){
  57. int len=0;
  58. for(int t=i;t;t>>=1) dig[len++]=t&1;
  59. for(int j=0;j<L;j++) rev[i]=(rev[i]<<1)|dig[j];
  60. }
  61. for(int i=0;i<len1;i++) a1[len1-i-1]=s1[i]-'0';
  62. for(int i=0;i<len2;i++) a2[len2-i-1]=s2[i]-'0';
  63. for(int i=0;i<n;i++) a[i]=E(a1[i]);
  64. for(int i=0;i<n;i++) b[i]=E(a2[i]);
  65. FFT(a,n,1);FFT(b,n,1);
  66. for(int i=0;i<n;i++) c[i]=a[i]*b[i];
  67. FFT(c,n,-1);
  68. for(int i=0;i<n;i++) sum[i]=c[i].real()+0.5;
  69. for(int i=0;i<n;i++){
  70. sum[i+1]+=sum[i]/10;
  71. sum[i]%=10;
  72. }
  73. int l=len1+len2-1;
  74. while(sum[l]==0&&l>0)l--;
  75. for(int i=l;i>=0;i--)
  76. putchar(sum[i]+'0');
  77. putchar('\n');
  78. }
  79. return 0;
  80. }

【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. 浅谈 echarts 用法

    对于服务型的公司来说,需要了解用户的使用趋势,来帮助分析市场的走向,所以说统计在一个管理后台中是必不可少的. 会用到echarts插件 ,其官网网址 http://echarts.baidu.com/ ...

  2. 【ADO.NET】 使用通用数据库操作类Database (SQL Server)

    一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...

  3. abp zero mysql版正式发布

    AbpZero-MySql aspnet-zero-1.12.0的mysql版本来啦.跟mssql版一样的功能,一样的代码. 获取源码

  4. 定时器、线程queue、进程池和线程池

    1.定时器 指定n秒后,执行任务 from threading import Timer,current_thread import os def hello(): print("%s he ...

  5. java8的lambda表达式,将List<DTO> 转为 List<DO>

    将List<PhoneDTO>转为List<PhoneDO>,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List<PhoneDT ...

  6. ThreadPoolExecutor 线程池

    TestThreadPoolExecutorMain package core.test.threadpool; import java.util.concurrent.ArrayBlockingQu ...

  7. Java Web开发之Spring | SpringMvc | Mybatis | Hibernate整合、配置、使用

    1.Spring与Mybatis整合 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web ...

  8. SQLServer · 最佳实践 · SQL Server 2012 使用OFFSET分页遇到的问题

    1. 背景 最近有一个客户遇到一个奇怪的问题,以前使用ROW_NUMBER来分页结果是正确的,但是替换为SQL SERVER 2012的OFFSET...FETCH NEXT来分页出现了问题,因此,这 ...

  9. Winform用Post方式打开IE

    1.主要实现Code void OpenNewIe(string url, string postData)///url是要post的网址,postData是要传入的参数 { if (ie != nu ...

  10. Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

    1.文件上传给服务器,服务器端必然要写代码进行支持,如下: 我们新建一个FileUpload.jsp的动态网页,同时我们上传文件只能使用post方式(不可能将上传数据拼凑在url路径下),上传数据Ap ...