Code[VS] 3123 高精度练习之超大整数乘法
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 高精度练习之超大整数乘法的更多相关文章
- codevs 3123 高精度练习之超大整数乘法
fft. #include<iostream> #include<cstdio> #include<cstring> #include<complex> ...
- 3123 高精度练习之超大整数乘法 - Wikioi
题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过100000位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Ou ...
- 【CodeVS 3123】高精度练习之超大整数乘法 &【BZOJ 2197】FFT快速傅立叶
第一次写法法塔,,,感到威力无穷啊 看了一上午算导就当我看懂了?PS:要是机房里能有个清净的看书环境就好了 FFT主要是用了巧妙的复数单位根,复数单位根在复平面上的对称性使得快速傅立叶变换的时间复杂度 ...
- c++ 超大整数除法 高精度除法
c++ 超大整数除法 高精度除法 解题思路 计算a/b,其中a为大整数,b为普通整数,商为c,余数为r. 根据手算除法的规则,上一步的余数记为r,则本次计算的被除数为t=r*10+被除数的本位数值a[ ...
- POJ 1001 解题报告 高精度大整数乘法模版
题目是POJ1001 Exponentiation 虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...
- codevs 3119 高精度练习之大整数开根 (各种高精+压位)
/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...
- JavaScript超大整数加法
原文:JavaScript超大整数加法 什么是「超大整数」? JavaScript 采用 IEEE754标准 中的浮点数算法来表示数字 Number. 我也没花时间去详细了解 IEEE754标准 ,但 ...
- c++ 超长整数乘法 高精度乘法
c++ 超长整数乘法 高精度乘法 解题思路 参考加法和减法解题思路 乘法不是一位一位的按照手算的方式进行计算,而是用循环用一个数的某一位去乘另外一个数 打卡代码 #include<bits/st ...
- poj2389-Bull Math(大整数乘法)
一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425 5 5 5 5 5 ...
随机推荐
- PHP开发之Zend Studio快捷键汇总
应用场景 快捷键 功能 查看快捷键 ctrl+shift+l 显示所有快捷键列表 查看和修改快捷键 打开Window->Preferences->General->keys 修改字体 ...
- 浅谈c#中的delegate和event了
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和ev ...
- Flume组件source,channel,sink源码分析
LifeCycleState: IDLE, START, STOP, ERROR [Source]: org.apache.flume.Source 继承LifeCycleAware{stop() + ...
- Oracle索引梳理系列(六)- Oracle索引种类之函数索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- C#如何使用Soap协议调用WebService?
WebService是什么?它的作用? WebService是一个平台独立.低耦合的.自包含的.基于可编程的可使用xml描述.调用的web应用程序,用于开发分布式的交互式的应用程序. Soap是什么? ...
- shell连接本机虚拟机
1.设置虚拟机的网络连接模式
- 如何在Oracle中复制表结构和表数据
1. 复制表结构及其数据: create table table_name_new as select * from table_name_old 2. 只复制表结构: create table ta ...
- Web报表工具FineReport的JS API开发(一)
很多报表软件可以利用JS接口来实现更多更复杂的功能.以FineReport为例,开放了大量的JS API给用户,根据执行JS的主体不同可以将分为三大类:FR.FS和contentWindow. 在js ...
- es6学习笔记2-解构赋值
解构赋值基本概论就按照一定的模式通过数组或者对象对一组变量进行赋值的过程. 1.通过数组对变量进行赋值: /*通过这种方式赋值要注意左右两边的结构模式要一样,在赋值的时候,根据位置进行赋值对应模式.* ...
- BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】
2330: [SCOI2011]糖果 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5395 Solved: 1750[Submit][Status ...