CODEVS 3123 高精度练习之超大整数乘法
来源:互联网 发布:华讯网络 怎么样 编辑:程序博客网 时间:2024/05/19 23:11
题目描述 Description
给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过100000位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A*B的值
样例输入 Sample Input
4 9
样例输出 Sample Output
36
数据范围及提示 Data Size & Hint
两个正整数的位数不超过100000位
分析
FFT板子题
代码
#include <bits/stdc++.h>using namespace std;const double _2pi = 3.1415926535 * 2;const int maxn = 10000000;int ans[maxn];struct complexNumber{ double real, image;};complexNumber add(complexNumber a, complexNumber b){ return (complexNumber){a.real + b.real, a.image + b.image};}complexNumber subtract(complexNumber a, complexNumber b){ return (complexNumber){a.real - b.real, a.image - b.image};}complexNumber multiply(complexNumber a, complexNumber b){ return (complexNumber){a.real * b.real - a.image * b.image, a.real * b.image + a.image * b.real};}vector<complexNumber> A, B;void init(){ ios::sync_with_stdio(false); string n, m; cin >> n >> m; for(int i = n.length() - 1; i >= 0; i--) A.push_back((complexNumber){double(n[i] - '0'), 0.0}); for(int i = m.length() - 1; i >= 0; i--) B.push_back((complexNumber){double(m[i] - '0'), 0.0});}vector<complexNumber> FFT(vector<complexNumber> X, bool inverse){ int n = X.size(); for(int i = 0, j = 0; i < n; i++) { if(i < j) swap(X[i], X[j]); int k = n; while(j & (k >>= 1)) j &= ~k; j |= k; } double theta = inverse == false ? _2pi : -_2pi; for(int s = 1; s <= log2((double)n); s++) { int m = pow(2, s); complexNumber omega_n = (complexNumber){cos(theta / double(m)), sin(theta / double(m))}; for(int k = 0; k < n; k += m) { complexNumber omega = (complexNumber){1.0, 0.0}; for(int j = 0; j < m / 2; j++) { complexNumber u = X[k + j], t = multiply(omega, X[k + j + m / 2]); X[k + j] = add(u, t); X[k + j + m / 2] = subtract(u, t); omega = multiply(omega, omega_n); } } } if(inverse == true) for(int i = 0; i < n; i++) X[i] = multiply(X[i], (complexNumber){1.0 / n, 0.0}); return X;}vector<complexNumber> Convolution(vector<complexNumber> A, vector<complexNumber> B){ vector<complexNumber> C; int s1 = A.size(), s2 = B.size(), n = 2; while(n < s1 + s2) n <<= 1; for(int i = s1; i < n; i++) A.push_back((complexNumber){0.0, 0.0}); vector<complexNumber> alpha = FFT(A, false); for(int i = s2; i < n; i++) B.push_back((complexNumber){0.0, 0.0}); vector<complexNumber> beta = FFT(B, false); for(int i = 0; i < n; i++) C.push_back(multiply(alpha[i], beta[i])); C = FFT(C, true); return C;}void solve(){ vector<complexNumber> C = Convolution(A, B); int len = A.size() + B.size() - 1; for(int i = 0; i < len; i++) ans[i] = (int)round(C[i].real); for(int i = 0; i < len; i++) ans[i + 1] += ans[i] / 10, ans[i] %= 10; while(ans[len] == 0 && len > 0) len--; for(int i = len; i >= 0; i--) cout << ans[i];}int main(){ init(); solve(); return 0;}
0 0
- 【CodeVS 3123】 高精度练习之超大整数乘法
- CODEVS 3123 高精度练习之超大整数乘法
- wikioi3123 高精度练习之超大整数乘法
- cv3123 高精度练习之超大整数乘法(FFT)
- 高精度-codevs-3117高精度练习之乘法
- 高精度练习之超大整数开根
- 【快速傅里叶变换】【FFT】【WikiOI】【P3132】【高精度练习之超大整数乘法】
- Codevs 3117 高精度练习之乘法
- codevs 3117 高精度练习之乘法
- 【codevs 3115 3116 3117】高精度练习之加/减/乘法
- codevs 3119 高精度练习之大整数开根
- 超大整数乘法模板(高精度乘以低精度)
- 高精度-codevs-3115高精度练习之减法
- 高精度-codevs-3116高精度练习之加法
- 3117 高精度练习之乘法
- 3117 高精度练习之乘法
- p3117 高精度练习之乘法
- 3117 高精度练习之乘法
- ListView多条目展示
- ARM中的---汇编指令
- 安卓与JS互调之android webview addJavascriptInterface 的方法不能调用
- vim的强大,vim设置和插件的使用,脱离windows才是王道
- 09.JavaScript内置对象
- CODEVS 3123 高精度练习之超大整数乘法
- js下载文件使用 iframe
- 伪类与伪元素的区别
- 共享内存实现进程间通信
- maven 配置篇之pom.xml
- Jackson整合及最佳实践
- 信道问题
- Dozer 简单封装实现深度转换Bean<->Bean的Mapper
- ArrayList与LinkedList、Vector主要区别