2016级算法第六次上机-B.ModricWang's FFT : EASY VERSION
1114 ModricWang's FFT EASY VERSION
思路
利用FFT做大整数乘法,实际上是把大整数变成多项式,然后做多项式乘法。
例如,对于\(1234\),改写成\(f(x)=1*x^3+2*x^2+3*x+4\),那么\(x=10\)处的值就是原数。类似的,对于输入的两个大整数,转换为\(f(x)\) 和\(g(x)\) ,利用FFT求出\(h(x)=f(x)*g(x)\) ,此时\(h(10)\) 就是乘积。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <random>
#include <functional>
#include <complex>
using namespace std;
const auto PI = acos(-1.0);
typedef complex<double> Complex;
void change(Complex y[], int len) {
int i, j, k;
for (i = 1, j = len / 2; i < len - 1; i++) {
if (i < j) swap(y[i], y[j]);
k = len / 2;
while (j >= k) {
j -= k;
k /= 2;
}
if (j < k)j += k;
}
}
void fft(Complex y[], int len, int on) {
change(y, len);
for (int h = 2; h <= len; h <<= 1) {
Complex wn(cos(-on * 2 * PI / h), sin(-on * 2 * PI / h));
for (int j = 0; j < len; j += h) {
Complex w(1, 0);
for (int k = j; k < j + h / 2; k++) {
Complex u = y[k];
Complex t = w * y[k + h / 2];
y[k] = u + t;
y[k + h / 2] = u - t;
w = w * wn;
}
}
}
if (on == -1)
for (int i = 0; i < len; i++)
y[i] = Complex(y[i].real() / len, y[i].imag());
}
const int MAXN = 200010;
Complex x1[MAXN], x2[MAXN];
string str1, str2;
int sum[MAXN];
int main() {
#ifdef ONLINE_JUDGE
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
#endif
cin >> str1 >> str2;
auto len1 = str1.length();
auto len2 = str2.length();
auto len = 1;
while (len < len1 * 2 || len < len2 * 2)len <<= 1;
for (auto i = 0; i < len1; i++)
x1[i] = Complex(str1[len1 - 1 - i] - '0', 0);
for (auto i = len1; i < len; i++)
x1[i] = Complex(0, 0);
for (int i = 0; i < len2; i++)
x2[i] = Complex(str2[len2 - 1 - i] - '0', 0);
for (auto i = len2; i < len; i++)
x2[i] = Complex(0, 0);
fft(x1, len, 1);
fft(x2, len, 1);
for (auto i = 0; i < len; i++)
x1[i] = x1[i] * x2[i];
fft(x1, len, -1);
for (int i = 0; i < len; i++)
sum[i] = static_cast<int>(lround(x1[i].real()));
for (int i = 0; i < len; i++) {
sum[i + 1] += sum[i] / 10;
sum[i] %= 10;
}
len = len1 + len2 - 1;
while (sum[len] <= 0 && len > 0)len--;
for (int i = len; i >= 0; i--)
cout << static_cast<char>(sum[i] + '0');
cout << "\n";
return 0;
}
2016级算法第六次上机-B.ModricWang's FFT : EASY VERSION的更多相关文章
- 2016级算法第六次上机-G.ModricWang likes geometry
1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码
- 2016级算法第六次上机-F.AlvinZH的学霸养成记VI
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...
- 2016级算法第六次上机-E.Bamboo之吃我一拳
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均 ...
- 2016级算法第六次上机-A.Bamboo之寻找小金刚
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...
- 2016级算法第六次上机-D.AlvinZH的学霸养成记V
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...
- 2016级算法第六次上机-C.AlvinZH的学霸养成记II
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...
- 2016级算法第五次上机-F.ModricWang的水系法术
1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...
- 2016级算法第四次上机-B ModricWang的序列问题
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...
- 2016级算法第五次上机-G.ModricWang的撒币游戏
1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...
随机推荐
- 10 Examples of HotSpot JVM Options in Java[z]
There are hundreds of JVM parameters or JVM Options exists inside sun JDK and its virtually impossib ...
- JetBrains全家桶激活地址
全家桶地址:https://www.jetbrains.com/products.html?fromMenu JetBrains 授权服务器(License Server URL):http://id ...
- Python爬虫利器一之Requests库的用法
前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...
- etl业务验证方法1
/* Copyright (c) 2015 Xiamen Weixin Software Co., Ltd. All rights reserved * * Create by huanglc@ho ...
- json解析2
客户端与服务器进行数据交互时,常常需要将数据在服务器端将数据转化成字符串并在客户端对json数据进行解析生成对象.但是用jsonObject和jsonArray解析相对麻烦.利用Gson和阿里的fas ...
- 获取iOS设备唯一标识
[获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...
- 服务器上创建git仓库
1. 在服务器上 su - git ,切换用户 2. 创建一个目录 mkdir test.git ,请注意带上 .git 扩展 3. 切换进入此目录,git init --bare ,初始化裸 ...
- linux源码安装php7.2.0
1. 源码包下载地址 2. 解压php压缩包 tar –zxvf php-7.2.0.tar.gz 3. 进入解压后的 cd php7.2.0 4.安装php需要的扩展 yum install lib ...
- mongodb-win32-i386-3.0.6 使用常见错误
1.Error parsing YAML config file: yaml-cpp: error at line 3, column 28: unknown escape character: m ...
- loadrunner - 问题汇总及解决方案(持续更新)
1.在此界面点击Run Load Tests提示: ”Can not save the license information because access to the registry is de ...