洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

刚学了FFT,我们来刷一道模板题。

题目描述

给定两个长度为 n 的两个十进制数,求它们的乘积。

n<=100000

如果用 n^2 暴力,肯定会 TLE。

我们把这两个数看成一个多项式。

f(x)=a0+a1*101+a2*102+a3*103+ ...... +an-1*10n-1

然后就可以愉快的FFT求解了!!

  1. #include<iostream>
  2. #include<cmath>
  3. #include<complex>
  4. #include<cstdio>
  5. using namespace std;
  6.  
  7. const double PI=acos(-);
  8. typedef complex<double> cmplx;
  9. int rev[];
  10. cmplx a[],b[];
  11. int n,bit=,output[];
  12. char s1[],s2[];
  13.  
  14. void get_rev(){
  15. for(int i=;i<bit;i++)
  16. rev[i]=(rev[i>>]>>)|(bit>>)*(i&);
  17. }
  18.  
  19. void FFT(cmplx *a,int dft){
  20. for(int i=;i<bit;i++)
  21. if(i<rev[i])swap(a[i],a[rev[i]]);
  22. for(int i=;i<bit;i<<=){
  23. cmplx W=exp(cmplx(,dft*PI/i));
  24. for(int j=;j<bit;j+=i<<){
  25. cmplx w(,);
  26. for(int k=j;k<j+i;k++,w*=W){
  27. cmplx x=a[k];
  28. cmplx y=w*a[k+i];
  29. a[k]=x+y;
  30. a[k+i]=x-y;
  31. }
  32. }
  33. }
  34. if(!~dft)for(int i=;i<bit;i++)a[i]/=bit;
  35. }
  36.  
  37. int main(){
  38. scanf("%d%s%s",&n,s1,s2);
  39. for(int i=;(<<i)<=*n;i++)bit<<=;
  40. for(int i=;i<n;i++){
  41. a[i]=s1[n-i-]-'';
  42. b[i]=s2[n-i-]-'';
  43. }
  44. get_rev();
  45. FFT(a,),FFT(b,);
  46. for(int i=;i<bit;i++)a[i]=a[i]*b[i];
  47. FFT(a,-);
  48. for(int i=;i<bit;i++){ //确保输出为十进制
  49. output[i]+=a[i].real()+0.5;
  50. output[i+]+=output[i]/;
  51. output[i]%=;
  52. }
  53. bool check=false;
  54. for(int i=n<<;i>=;i--){ //去前导零输出
  55. if(check||output[i]){
  56. printf("%d",output[i]);
  57. check=true;
  58. }
  59. }
  60. if(!check)printf("");
  61. }

FFT学习笔记

洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)的更多相关文章

  1. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

  2. 【洛谷P1919】A*B Problem升级版

    题目大意:rt 题解:将长度为 N 的大整数看作是一个 N-1 次的多项式,利用 FFT 计算多项式的卷积即可. 代码如下 #include <bits/stdc++.h> using n ...

  3. 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...

  4. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  5. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  6. 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...

  7. 洛谷P1919 A*B problem 快速傅里叶变换模板 [FFT]

    题目传送门 A*B problem 题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数 ...

  8. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  9. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. Android Handler机制剖析

    android的handler机制是android的线程通信的核心机制 Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃. Android中的实现了 接收消息的& ...

  2. Hessian源码分析--HessianProxyFactory

    HessianProxyFactory是HessianProxy的工厂类,其通过HessianProxy来生成代理类. 如下面代码: HessianProxyFactory factory = new ...

  3. LaTex计数器

    记数器 绝大多数都与可以改变他们的命令有相同的名称 part chapter section subsection paragraph subparagraph page equation figur ...

  4. eclipse代码恢复(开发程序代码恢复)

    如果误操作,让本地代码丢失了不用怕,Eclipse local history可以恢复. 误删除文件后,直接ctrl+z可以恢复. 拉去代码覆盖了本地,也可以一个一个或者整体进行恢复:http://b ...

  5. Android初级教程Activity小案例(计算器乘法运算)

    首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: &l ...

  6. React Native调试心得

    在做React Native开发时,少不了的需要对React Native程序进行调试.调试程序是每一位开发者的基本功,高效的调试不仅能提高开发效率,也能降低Bug率.本文将向大家分享React Na ...

  7. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  8. leetcode之 Generate Parentheses

    题目:http://oj.leetcode.com/problems/generate-parentheses/ 描述:给定一个非负整数n,生成n对括号的所有合法排列. 解答: 该问题解的个数就是卡特 ...

  9. [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. 【Qt编程】Qt学习笔记<二>

    1.      QApplication类和QWidget类都包含在QtGui模块中.所以我们可以只包含这个头文件即可. 2.      在c++中,用new分配了内存空间就需要用delete来释放空 ...