题目链接:VFMUL - Very Fast Multiplication

Description

Multiply the given numbers.

Input

n [the number of multiplications <= 101]

l1 l2 [numbers to multiply (at most 300000 decimal digits each)]

Text grouped in [ ] does not appear in the input file.

Output

The results of multiplications.

Example

  1. Input:
  2. 5
  3. 4 2
  4. 123 43
  5. 324 342
  6. 0 12
  7. 9999 12345
  8. Output:
  9. 8
  10. 5289
  11. 110808
  12. 0
  13. 123437655

Warning: large Input/Output data, be careful with certain languages

Solution

题意

求两数的乘积

思路

FFT

FFT 求高精度乘法的模板题。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const double PI = acos(-1);
  4. typedef complex<double> Complex;
  5. const int maxn = 3e6 + 10;
  6. Complex a[maxn], b[maxn];
  7. int m, n;
  8. int bit = 2, rev[maxn];
  9. int ans[maxn];
  10. void get_rev(){
  11. memset(rev, 0, sizeof(rev));
  12. while(bit <= n + m) bit <<= 1;
  13. for(int i = 0; i < bit; ++i) {
  14. rev[i] = (rev[i >> 1] >> 1) | (bit >> 1) * (i & 1);
  15. }
  16. }
  17. void FFT(Complex *a, int op) {
  18. for(int i = 0; i < bit; ++i) {
  19. if(i < rev[i]) swap(a[i], a[rev[i]]);
  20. }
  21. for(int mid = 1; mid < bit; mid <<= 1) {
  22. Complex wn = Complex(cos(PI / mid), op * sin(PI / mid));
  23. for(int j = 0; j < bit; j += mid<<1) {
  24. Complex w(1, 0);
  25. for(int k = 0; k < mid; ++k, w = w * wn) {
  26. Complex x = a[j + k], y = w * a[j + k + mid];
  27. a[j + k] = x + y, a[j + k + mid] = x - y;
  28. }
  29. }
  30. }
  31. }
  32. int main() {
  33. int T;
  34. scanf("%d", &T);
  35. while(T--) {
  36. memset(a, 0, sizeof(a));
  37. memset(b, 0, sizeof(b));
  38. string s1, s2;
  39. cin >> s1 >> s2;
  40. n = s1.size(), m = s2.size();
  41. for(int i = 0; i < n; ++i) {
  42. a[i] = s1[n - i - 1] - '0';
  43. }
  44. for(int i = 0; i < m; ++i) {
  45. b[i] = s2[m - i - 1] - '0';
  46. }
  47. get_rev();
  48. FFT(a, 1);
  49. FFT(b, 1);
  50. for(int i = 0; i <= bit; ++i) {
  51. a[i] *= b[i];
  52. }
  53. FFT(a, -1);
  54. for(int i = 0; i < n + m; ++i) {
  55. ans[i] = (int)(a[i].real() / bit + 0.5);
  56. }
  57. for(int i = 1; i < n + m; ++i) {
  58. ans[i] = ans[i] + ans[i - 1] / 10;
  59. ans[i - 1] = ans[i - 1] % 10;
  60. }
  61. int s = n + m - 1;
  62. for(; s >= 0; --s) {
  63. if(ans[s]) break;
  64. }
  65. if(s < 0) printf("0\n");
  66. else {
  67. for(int i = s; i >= 0; --i) {
  68. printf("%d", ans[i]);
  69. }
  70. printf("\n");
  71. }
  72. }
  73. return 0;
  74. }

SPOJ VFMUL - Very Fast Multiplication (FFT)的更多相关文章

  1. SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法

    SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...

  2. spoj VFMUL FFT快速傅立叶变换模板题

    题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...

  3. spoj Fast Multiplication

    题意:乘法 要用nlogn的fft乘法. //#pragma comment(linker,"/STACK:1024000000,1024000000") #include< ...

  4. SPOJ TSUM Triple Sums(FFT + 容斥)

    题目 Source http://www.spoj.com/problems/TSUM/ Description You're given a sequence s of N distinct int ...

  5. 2018.11.18 spoj Triple Sums(容斥原理+fft)

    传送门 这次fftfftfft乱搞居然没有被卡常? 题目简述:给你nnn个数,每三个数ai,aj,ak(i<j<k)a_i,a_j,a_k(i<j<k)ai​,aj​,ak​( ...

  6. Hamming Weight的算法分析(转载)

    看代码时遇到一个求32bit二进制数中1的个数的问题,感觉算法很奇妙,特记录学习心得于此,备忘. 计算一个64bit二进制数中1的个数. 解决这个问题的算法不难,很自然就可以想到,但是要给出问题的最优 ...

  7. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  8. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  9. SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)

    题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围:  1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...

随机推荐

  1. 解决(Oracle)ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接 问题

    解决(Oracle)ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接 问题通过在CMD下用lsnrctl status 查看出的问题:发现BLOCKEDORACLE启动步骤:s ...

  2. Process Hacker源码中的用户态hook的做法

    processhacker-code-5632\1.x\trunk\NProcessHacker\hook.h typedef struct _PH_HOOK { PVOID Function; PV ...

  3. 常用Javascript方法

    一,检测是否是Array 1,通过constructor检测 function isArray(value){ return value && typeof value === 'ob ...

  4. go 区分指针

    先看一段代码 先放一段代码,人工运行一下,看看自己能做对几题? package main import "fmt" func main() { var a int = 1 var ...

  5. 理解EntityFramework两个核心类型的职责 DbSet和D'bContext

    DbSet与DbContext是多对一的关系DbSet是实体对象的集合,提供了实现CRUD的相应方法DbContext封装与数据库和数据模型相关的功能,依据数据实体状态创建SQL命令,将数据更改保存到 ...

  6. 2018-8-10-WPF-DrawingVisual

    title author date CreateTime categories WPF DrawingVisual lindexi 2018-08-10 19:16:53 +0800 2018-2-1 ...

  7. OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&GLEW

    最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云.逐决定先搭OpenGL运行环境,详细如下. 1.首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实 ...

  8. [转] datetime.now、datetime.utcnow以及Django中的timezone.now之间的区别

      https://blog.csdn.net/sinat_41898105/article/details/80984298   在我们使用Django做项目时经常会遇到时间的存储与读取不一致的问题 ...

  9. 学习记录:@Transactional 事务不生效

    测试时使用spring boot2.2.0,在主类中调用,@Transactional 不起作用,原代码如下: @SpringBootApplication @Slf4j @Component pub ...

  10. Vue 一些零零散散~

    1. F5刷新不会触发vue的destroyed事件. 2. computed 的 vuex 数据 ------>   beforeCreated: undefined   /    creat ...