FFT 做 高精度乘法

 #include <bits/stdc++.h>

 const double pi = acos(-);

 struct complex
{
double a, b; inline complex(
double _a = ,
double _b = )
{
a = _a;
b = _b;
} inline friend complex operator +
(const complex &a, const complex &b)
{
return complex(a.a + b.a, a.b + b.b);
} inline friend complex operator -
(const complex &a, const complex &b)
{
return complex(a.a - b.a, a.b - b.b);
} inline friend complex operator *
(const complex &a, const complex &b)
{
return complex(a.a*b.a - a.b*b.b, a.a*b.b + a.b*b.a);
} inline friend complex & operator +=
(complex &a, const complex &b)
{
return a = a+b;
} inline friend complex & operator -=
(complex &a, const complex &b)
{
return a = a-b;
} inline friend complex & operator *=
(complex &a, const complex &b)
{
return a = a*b;
}
}; inline complex alpha(double a)
{
return complex(cos(a), sin(a));
} typedef std::vector<complex> vec; vec FFT(const vec &a)
{
int n = a.size(); if (n == )return a; complex w_k(, );
complex w_n = alpha(pi*/n); vec ar[], yr[], y(n); for (int i = ; i < n; ++i)
ar[i & ].push_back(a[i]); for (int i = ; i < ; ++i)
yr[i] = FFT(ar[i]); for (int i = ; i < n/; ++i, w_k *= w_n)
{
y[i] = yr[][i] + w_k * yr[][i];
y[i + n/] = yr[][i] - w_k * yr[][i];
} return y;
} vec IFFT(const vec &a)
{
int n = a.size(); if (n == )return a; complex w_k(, );
complex w_n = alpha(-pi*/n); vec ar[], yr[], y(n); for (int i = ; i < n; ++i)
ar[i & ].push_back(a[i]); for (int i = ; i < ; ++i)
yr[i] = IFFT(ar[i]); for (int i = ; i < n/; ++i, w_k *= w_n)
{
y[i] = yr[][i] + w_k * yr[][i];
y[i + n/] = yr[][i] - w_k * yr[][i];
} return y;
} char s1[]; int len1;
char s2[]; int len2; vec v1, v2, p1, p2, mul, ans; signed main(void)
{
scanf("%s", s1); len1 = strlen(s1);
scanf("%s", s2); len2 = strlen(s2); int len = len1 + len2; while (len != (len&-len))++len; for (int i = len1 - ; ~i; --i)v1.push_back(complex(s1[i] - '', ));
for (int i = len2 - ; ~i; --i)v2.push_back(complex(s2[i] - '', )); while ((int)v1.size() < len)v1.push_back(complex());
while ((int)v2.size() < len)v2.push_back(complex()); p1 = FFT(v1);
p2 = FFT(v2); for (int i = ; i < len; ++i)
mul.push_back(p1[i] * p2[i]); ans = IFFT(mul); std::vector<int> ret; for (int i = ; i < len; ++i)
ret.push_back((int)round(ans[i].a / len)); for (int i = ; i < len; ++i)
if (ret[i] >= )
{
ret[i + ] += ret[i] / ;
ret[i] %= ;
} while (ret.size() != && !ret[ret.size() - ])
ret.pop_back(); for (int i = ret.size() - ; i >= ; --i)
putchar('' + ret[i]);
putchar('\n');
}

@Author: YouSiki

Code[VS] 3123 高精度练习之超大整数乘法的更多相关文章

  1. codevs 3123 高精度练习之超大整数乘法

    fft. #include<iostream> #include<cstdio> #include<cstring> #include<complex> ...

  2. 3123 高精度练习之超大整数乘法 - Wikioi

    题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过100000位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Ou ...

  3. 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶

    第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...

  4. c++ 超大整数除法 高精度除法

    c++ 超大整数除法 高精度除法 解题思路 计算a/b,其中a为大整数,b为普通整数,商为c,余数为r. 根据手算除法的规则,上一步的余数记为r,则本次计算的被除数为t=r*10+被除数的本位数值a[ ...

  5. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  6. codevs 3119 高精度练习之大整数开根 (各种高精+压位)

    /* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...

  7. JavaScript超大整数加法

    原文:JavaScript超大整数加法 什么是「超大整数」? JavaScript 采用 IEEE754标准 中的浮点数算法来表示数字 Number. 我也没花时间去详细了解 IEEE754标准 ,但 ...

  8. c++ 超长整数乘法 高精度乘法

    c++ 超长整数乘法 高精度乘法 解题思路 参考加法和减法解题思路 乘法不是一位一位的按照手算的方式进行计算,而是用循环用一个数的某一位去乘另外一个数 打卡代码 #include<bits/st ...

  9. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

随机推荐

  1. android 图片性能优化

    本章讲述在android开发中,图片处理方面的优化.包括知识点为大图加载,图片压缩,图片缓存处理及开源图片处理框架Universal-Image-Loader. 1.图片引发的内存不足 当在andro ...

  2. Python语言Web开发框架web2py

    python开发的强大的网络框架web2py,这个框架需要下载和集成. http://www.web2py.com/examples/static/web2py_src.zip

  3. fdisk添加分区引起的Linux Error: 22: Invalid argument

    在Linux服务器(虚拟机)上使用fdisk添加分区.格式化分区后,遇到了Linux Error: 22: Invalid argument错误,操作步骤如下所示 [root@oracle-serve ...

  4. mysql的DATE_FORMAT用法

    DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的输出格式. mysql的DATE_FORMAT用法 %a 缩写星期名 %b 缩写月名 %c ...

  5. Memcached学习笔记

    [TOC] 前言 此为学习笔记汇总,如有纰漏之处,还望不吝指出,谢谢. 启动流程 调用settings_init()设定初始化参数 从启动命令中读取参数来设置setting值 设定LIMIT参数 开始 ...

  6. java服务器端编程

    由于要做手机端安卓程序,所以使用java来开发.后来又看了javaweb,觉得java还是很不错的,功能很强大,可以做很多事,最重要的是资源非常丰富,有很多开源的库框架之类. 最近用java做一个服务 ...

  7. x01.Weiqi.10: 死活问题

    估计得不错,点目后,仅一个方法:UpdateMeshes5() 就完美解决了梅花六.刀把五.斗笠四.盘角曲四等死活问题.先来看看效果图: 其代码如下: void UpdateMeshes5(bool ...

  8. shell九九乘法表

    #!/bin/bash ..}; do ..}; do if [ $x -ge $y ]; then echo -ne "$y*$x=$[$y*$x] \t" fi done ec ...

  9. JavaScript中知而不全的this

    都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把 函数式编程和 面向对象编程糅合一起,再加上 动态语言特性,简直强大无比(其实是不能和C++比的,^_^ ). 这 ...

  10. windows 2012 r2下安装sharepoint 2013错误解决

    日前,我在安装sharepoint 2013时,需要预部署一些软件,我们知道运行产品准备工具“prerequisiteinstaller”后就可以自动下载安装配置这些软件,但是使用系统为windows ...