转载来源:https://blog.csdn.net/zj_whu/article/details/72954766

#include <cstdio>

#include <cmath>

#include <complex>

#include <cstring>

using namespace std;

const double PI(acos(-1.0));

typedef complex<double> C;

const int N = (1 << 20);

int ans[N];

C a[N], b[N];

char s[N], t[N];

void bit_reverse_swap(C* a, int n) {

  for (int i = 1, j = n >> 1, k; i < n - 1; ++i) {

    if (i < j) swap(a[i], a[j]);

    // tricky

    for (k = n >> 1; j >= k; j -= k, k >>= 1)  // inspect the highest "1"

      ;

    j += k;

  }

}

void FFT(C* a, int n, int t) {

  bit_reverse_swap(a, n);

  for (int i = 2; i <= n; i <<= 1) {

    C wi(cos(2.0 * t * PI / i), sin(2.0 * t * PI / i));

    for (int j = 0; j < n; j += i) {

      C w(1);

      for (int k = j, h = i >> 1; k < j + h; ++k) {

        C t = w * a[k + h], u = a[k];

        a[k] = u + t;

        a[k + h] = u - t;

        w *= wi;

      }

    }

  }

  if (t == -1) {

    for (int i = 0; i < n; ++i) {

      a[i] /= n;

    }

  }

}

int trans(int x) {

  return 1 << int(ceil(log(x) / log(2) - 1e-9));  // math.h/log() 以e为底

}

int main() {

  //  freopen("test0.in","r",stdin);

  // freopen("test0b.out","w",stdout);

  int n, m, l;

  for (; ~scanf("%s%s", s, t);) {

    n = strlen(s);

    m = strlen(t);

    l = trans(n + m - 1);  // n次*m次不超过n+m-1次

    for (int i = 0; i < n; ++i) a[i] = C(s[n - 1 - i] - '0');

    for (int i = n; i < l; ++i) a[i] = C(0);

    for (int i = 0; i < m; ++i) b[i] = C(t[m - 1 - i] - '0');

    for (int i = m; i < l; ++i) b[i] = C(0);

FFT(a, l, 1);  //把A和B换成点值表达

    FFT(b, l, 1);

    for (int i = 0; i < l; ++i)  //点值做乘法

      a[i] *= b[i];

    FFT(a, l, -1);  //逆DFT

    for (int i = 0; i < l; ++i) ans[i] = (int)(a[i].real() + 0.5);

    ans[l] = 0;  // error-prone :'l' -> '1'

    for (int i = 0; i < l; ++i) {

      ans[i + 1] += ans[i] / 10;

      ans[i] %= 10;

    }

    int p = l;

    for (; p && !ans[p]; --p)

      ;

    for (; ~p; putchar(ans[p--] + '0'))

      ;

        puts("");

    }

    return 0;

}

FFT用于高效大数乘法(当模板用)的更多相关文章

  1. 51nod 1027大数乘法

    题目链接:51nod 1027大数乘法 直接模板了. #include<cstdio> #include<cstring> using namespace std; ; ; ; ...

  2. [hdu1402]大数乘法(FFT模板)

    题意:大数乘法 思路:FFT模板 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...

  3. ACM学习历程—51NOD1028 大数乘法V2(FFT)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 题目大意就是求两个大数的乘法. 但是用普通的大数乘法,这 ...

  4. 1028 大数乘法 V2(FFT or py)

    1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果.   Input 第1行:大数A 第2行:大数B ...

  5. Java 大数、高精度模板

    介绍: java中用于操作大数的类主要有两个,一个是BigInteger,代表大整数类用于对大整数进行操作,另一个是BigDecimal,代表高精度类,用于对比较大或精度比较高的浮点型数据进行操作.因 ...

  6. FFT教你做乘法(FFT傅里叶变换)

    题目来源:https://biancheng.love/contest/41/problem/C/index FFT教你做乘法 题目描述 给定两个8进制正整数A和B(A和B均小于10000位),请利用 ...

  7. [POJ] #1001# Exponentiation : 大数乘法

    一. 题目 Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 156373   Accepted: ...

  8. hdu_1042(模拟大数乘法)

    计算n! #include<cstring> #include<cstdio> using namespace std; ]; int main() { int n; whil ...

  9. hdu1313 Round and Round We Go (大数乘法)

    Problem Description A cyclic number is an integer n digits in length which, when multiplied by any i ...

随机推荐

  1. 设计模式在 Spring 框架中的良好应用

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...

  2. codeforces 816B Karen and Coffee (差分思想)

    题目链接 816B Karen and Coffee 题目分析 题意:有个人在学泡咖啡,因此看了很多关于泡咖啡温度的书,得到了n种推荐的泡咖啡温度范围[L1,R1] ,此人将有k种做法推荐的温度记为可 ...

  3. 求问:numpy里面索引时,采用整型数组和整型列表的区别!

  4. 记一次完整的java项目压力测试

    总结:通过这次压力测试,增加了对程序的理解:假定正常情况下方法执行时间为2秒,吞吐量为100/s,则并发为200/s:假设用户可接受范围为10s,那么并发量可以继续增加到1000/s,到这个时候一切还 ...

  5. Eclipse快速生成do while if 等方法

    选中所需要加方法的代码  右键  选中 surrounded with选择你需要就可以了

  6. k8s的一些基本命令

    kubernetes用到的一些命令 kubectl管理工具以及命令 基础命令:create,delete,get,run,expose,set,explain,edit. create命令:根据文件或 ...

  7. 02 Linux常用基本命令(二)

    1.Linux的文件系统格式 1.以 / 为根目录,成树状结构分布 2.查看根目录下有什么 ls / 3./下有超级用户root的家目录(root),还有普通用户的家目录(/home) 4.常用文件夹 ...

  8. 请手写代码实现一个promise

    第一步:promise的声明 class Promise{ // 构造器 constructor(executor){ // 成功 let resolve = () => { }; // 失败 ...

  9. Clang调试deadcode思路

    首先描述下我的环境:Ubuntu16.04 llvm4.0 clang4.0全部使用源码安装方式 Clang的根目录,位于llvm-src下边的tools目录下. 因为需要找到真正的开关,下边我描述下 ...

  10. 从程序员小仙飞升上神,java技术开发要如何实现?

    新霸哥是一个专业从事java开发的,近期,新霸哥发现很多的朋友在问,从程序员小仙飞升上神难吗?在此新霸哥将为你详细的介绍,下面新霸哥将从新手入门和老司机进阶多方面详细的为大家介绍一下. 说起java首 ...