学会了FFT之后感觉自己征服了世界!

当然是幻觉...

不过FFT还是很有用的,在优化大规模的动规问题的时候有极大效果.

一般比较凶残的计数动规题都需要FFT(n<=1e9).

下面是高精度乘法的板子.

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<ctime>
  6. #include<cmath>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<set>
  10. #include<map>
  11. #include<iomanip>
  12. using namespace std;
  13. #define LL long long
  14. #define up(i,j,n) for(int i=j;i<=n;i++)
  15. #define pii pair<int,int>
  16. #define db double
  17. #define eps 1e-4
  18. #define FILE "dealing"
  19. int read(){
  20. int x=0,f=1,ch=getchar();
  21. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  22. while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0',ch=getchar();}
  23. return x*f;
  24. }
  25. const int maxn=401000,inf=1000000000000000LL,limit=20000,mod=9973;
  26. bool cmin(int& a,int b){return a>b?a=b,true:false;}
  27. bool cmax(int& a,int b){return a<b?a=b,true:false;}
  28.  
  29. namespace FFT{
  30. int ans[maxn];
  31. db pi=(acos(-1.0));
  32. struct cp{
  33. db x,y;
  34. cp(db x=0,db y=0):x(x),y(y){}
  35. inline cp operator+(const cp& b){return cp(x+b.x,y+b.y);}
  36. inline cp operator-(const cp& b){return cp(x-b.x,y-b.y);}
  37. inline cp operator*(const cp& b){return cp(x*b.x-y*b.y,x*b.y+y*b.x);}
  38. }w[maxn],a[maxn],b[maxn];
  39. int L,H,R[maxn];
  40. inline void swap(cp& x,cp& y){cp t(x);x=y;y=t;}
  41. void FFT(cp* a,int f){
  42. up(i,0,L-1)if(i<R[i])swap(a[i],a[R[i]]);
  43. for(int len=2;len<=L;len<<=1){
  44. int l=len>>1;
  45. cp wn(cos(pi/l),f*sin(pi/l));
  46. up(i,1,l-1)w[i]=w[i-1]*wn;
  47. for(int st=0;st<L;st+=len){
  48. for(int k=0;k<l;k++){
  49. cp x=a[st+k],y=w[k]*a[st+k+l];
  50. a[st+k]=x+y,a[st+k+l]=x-y;
  51. }
  52. }
  53. }
  54. if(f==-1)up(i,0,L-1)a[i].x/=L;
  55. }
  56. void prepare(){
  57. w[0].x=1;
  58. up(i,0,L)R[i]=(R[i>>1]>>1)|((i&1)<<(H-1));
  59. }
  60. void solve(int* c,int *d,int n,int m,int* ch){
  61. up(i,0,n-1)a[i].x=c[i+1],a[i].y=0;
  62. up(i,0,m-1)b[i].x=d[i+1],b[i].y=0;
  63. n++,m++;
  64. for(H=0,L=1;L<n+m-1;H++)L<<=1;
  65. prepare();
  66. FFT(a,1);FFT(b,1);
  67. up(i,0,L-1)a[i]=a[i]*b[i];
  68. FFT(a,-1);
  69. up(i,0,n+m-2)ch[i+1]=(int)(a[i].x+0.5);
  70. return;
  71. }
  72. };
  73. char s[maxn];
  74. int a[maxn],b[maxn],n,m,ans[maxn];
  75. int main(){
  76. freopen(FILE".in","r",stdin);
  77. freopen(FILE".out","w",stdout);
  78. scanf("%s",s+1);
  79. n=strlen(s+1);
  80. for(int i=1;i<=n;i++)a[i]=s[n-i+1]-'0';
  81. scanf("%s",s+1);
  82. m=strlen(s+1);
  83. for(int i=1;i<=m;i++)b[i]=s[m-i+1]-'0';
  84. FFT::solve(a,b,n,m,ans);
  85. int len=n+m;
  86. for(int i=1;i<=len;i++)if(ans[i]>=10)ans[i+1]+=ans[i]/10,ans[i]%=10;
  87. while(ans[len]>=10)ans[len+1]+=ans[len]/10,ans[len]%=10,len++;
  88. while(!ans[len]&&len>1)len--;
  89. for(int i=len;i>=1;i--)printf("%d",ans[i]);
  90. return 0;
  91. }

  

高精度乘法(FFT)的更多相关文章

  1. FFT实现高精度乘法

    你应该知道$FFT$是用来处理多项式乘法的吧. 那么高精度乘法和多项式乘法有什么关系呢? 观察这样一个$20$位高精度整数$11111111111111111111$ 我们可以把它处理成这样的形式:$ ...

  2. P1919 FFT加速高精度乘法

    P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...

  3. [vijos P1040] 高精度乘法

    如果这次noip没考好,完全是因为从7月29日之后就没有再写过程序了.说起来,真是一个泪流满面的事实… 那这样一个弱智题练手恢复代码能力,竟然还花了我两个晚上(当然不是两整个晚上…) 第一天TLE了, ...

  4. 【PKU1001】Exponentiation(高精度乘法)

    Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 145642   Accepted: 35529 ...

  5. hdu 1042 N!(高精度乘法 + 缩进)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 题目大意:求n!, n 的上限是10000. 解题思路:高精度乘法 , 因为数据量比较大, 所以 ...

  6. hdu 1042 N!(高精度乘法)

    Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!   Input One N in ...

  7. Vijos 1040 高精度乘法

    描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...

  8. 【POJ 1001】Exponentiation (高精度乘法+快速幂)

    BUPT2017 wintertraining(15) #6A 题意 求\(R^n\) ( 0.0 < R < 99.999 )(0 < n <= 25) 题解 将R用字符串读 ...

  9. 【BZOJ5300】[CQOI2018]九连环 (高精度,FFT)

    [BZOJ5300][CQOI2018]九连环 (高精度,FFT) 题面 BZOJ 洛谷 题解 去这里看吧,多么好 #include<iostream> #include<cstdi ...

随机推荐

  1. [转载][FPGA]有限状态机FSM学习笔记(二)

    1. Mealy和Moore状态机的互换 对于给定的时序逻辑功能,可以用Mealy机实现,也可以用Moore机实现.根据Moore机比Mealy机输出落后一个周期的特性,可以实现两种状态机之间的转换. ...

  2. 遇到的cannot find module 'xxx' 问题

    昨天配置新项目的环境,明明都npm inatsll都安装了,再次运行的时候一直报错,缺少模块.我以为就一个没安装上,就手动npm install -g 'xxx' :结果一个装好了,又继续蹦出cann ...

  3. git history 记录(上传到 issu-170 )

    一.上传到gitlab 本地issu-170落后git很多,发生冲突的要手动修改. 2000 cd robot_demo_0226_ws/ 2001 ls 2002 cd IGV01-SW-170 2 ...

  4. Wireshark如何选择多行

    Wireshark如何选择多行   在Wireshark中,用户经常需要选择几行,然后进行批量操作,如导出或者分析.但Wireshark没有提供通过鼠标直接选择多行的功能.这个时候,用户需要采用标记分 ...

  5. The 2016 ACM-ICPC Asia China-Final Contest Promblem D

    显然答案具有单调性,可以二分.问题是 我们二分出一个 堆数,该怎么判定能否达到这个堆数呢? 我们可以很简单的用调整法证明,最底下的一层的冰淇淋肯定是最小的那些,往上叠加的话我们再贪心的让较少的放在较小 ...

  6. 上传图片/文件到server

    package yao.camera.util; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; impo ...

  7. shell(2):正则表达式

    一.整理正则表达式博客 (1)正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 在linux中,通配符是由shel ...

  8. Hdu-1565 方格取数(1) (状态压缩dp入门题

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  9. Qt在线讲座之QML脚本书写规范

    时间:2016年3月1日晚7:30 在线讲座:http://qtdream.com主页处就可以收看直播(详见主页提示) 參与对象:对Qt跨平台开发框架感兴趣的朋友们.当然了,假设你是大牛.也可以旁听一 ...

  10. kubernetes调度之pod优先级和资源抢占

    系列目录 Pod可以拥有优先级.优先意味着相对于其它pod某个pod更为重要.如果重要的pod不能被调度,则kubernetes调度器会优先于(驱离)低优先级的pod来让处于pending状态的高优先 ...