HDU 1402 A * B Problem Plus (FFT模板题)
FFT模板题,求A*B。
用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环。
取出结果值时注意精度,要加上eps才能A。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const double pi = acos(-1.0);
const int maxn = 50000 + 5;
const double eps = 1e-6; struct Complex {
double a, b;
Complex() {
}
Complex(double a, double b) :
a(a), b(b) {
}
Complex operator +(const Complex& t) const {
return Complex(a + t.a, b + t.b);
}
Complex operator -(const Complex& t) const {
return Complex(a - t.a, b - t.b);
}
Complex operator *(const Complex& t) const {
return Complex(a * t.a - b * t.b, a * t.b + b * t.a);
}
}; // 二进制平摊反转置换
void brc(Complex *x, int n) {
int i, j, k;
for (i = 1, j = n >> 1; i < n - 1; i++) {
if (i < j)
swap(x[i], x[j]); k = n >> 1;
while (j >= k) {
j -= k;
k >>= 1;
}
if (j < k)
j += k;
}
} // FFT,其中on==1时为DFT,on==-1时为IDFT
void FFT(Complex *x, int n, int on) {
int h, i, j, k, p;
double r;
Complex u, t;
brc(x, n);
for (h = 2; h <= n; h <<= 1) { // 控制层数
r = on * 2.0 * pi / h;
Complex wn(cos(r), sin(r));
p = h >> 1;
for (j = 0; j < n; j += h) {
Complex w(1, 0);
for (k = j; k < j + p; k++) {
u = x[k];
t = w * x[k + p];
x[k] = u + t;
x[k + p] = u - t;
w = w * wn;
}
}
}
if (on == -1) // IDFT
for (i = 0; i < n; i++)
x[i].a = x[i].a / n + eps;
} int n, ma, N;
Complex x1[maxn<<2], x2[maxn<<2];
char sa[maxn], sb[maxn];
int ans[maxn<<1]; void solve() {
int n1 = strlen(sa), n2 = strlen(sb);
int N = 1, tmpn = max(n1, n2) << 1;
// N应为2的幂次
while(N < tmpn) N <<= 1;
for(int i = 0;i < N; i++)
x1[i].a = x1[i].b = x2[i].a = x2[i].b = 0;
for(int i = 0;i < n1; i++)
x1[i].a = sa[n1-i-1] - '0';
for(int i = 0;i < n2; i++)
x2[i].a = sb[n2-i-1] - '0';
FFT(x1, N, 1); FFT(x2, N, 1);
for(int i = 0;i < N; i++)
x1[i] = x1[i]*x2[i];
FFT(x1, N, -1);
int pre = 0, top = 0;
for(int i = 0;i < n1+n2; i++) {
// 不加epsA不了~
int cur = (int)(x1[i].a + eps);
ans[++top] = (cur + pre)%10;
pre = (pre + cur)/10;
}
while(!ans[top] && top > 1) top--;
for(int i = top;i >= 1; i--)
printf("%d", ans[i]);
puts("");
} int main() {
while(scanf("%s%s", sa, &sb) != -1) {
solve();
}
return 0;
}
HDU 1402 A * B Problem Plus (FFT模板题)的更多相关文章
- HDU - 1402 A * B Problem Plus FFT裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...
- hdu 1402 A * B Problem Plus FFT
/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDU - 1402 A * B Problem Plus (FFT实现高精度乘法)
题意:计算A*B,A,B均为长度小于50000的整数. 这是FFT在大整数相乘中的一个应用,我本来想用NTT做的,但NTT由于取模很可能取炸,所以base必须设得很小,而且效率也比不上FFT. A和B ...
- [hdu1402]A * B Problem Plus(FFT模板题)
解题关键:快速傅里叶变换fft练习. 关于结果多项式长度的确定,首先将短多项式扩展为长多项式,然后扩展为两倍. #include<cstdio> #include<cstring&g ...
- HDU 5832 A water problem(某水题)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- hdu 1402 A * B Problem Plus (FFT模板)
A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...
- HDU 1402 A * B Problem Plus(FFT)
Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to ...
- FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: th ...
随机推荐
- Android学习笔记(二)之异步加载图片
最近在android开发中碰到比较棘手的问题,就是加载图片内存溢出.我开发的是一个新闻应用,应用中用到大量的图片,一个界面中可能会有上百张图片.开发android应用的朋友可能或多或少碰到加载图片内存 ...
- hadoop权威指南 chapter2 MapReduce
MapReduce MapReduce is a programming model for data processing. The model is simple, yet not too sim ...
- bootstrap前端开发框架,未来发展趋势
http://v3.bootcss.com/getting-started/Bootstrap 起步 CSS 组件 JavaScript插件 定制 关于 CSS 设置全局CSS样式,基本的HTML元素 ...
- Intel 被 ARM 逼急了
英特尔最近推出基于Silvermont架构Bay Trail系列处理器,相对前一代Bonnell架构的最突出的改进就是支持乱序执行 silvermon架构的处理器将出现在pc,平板等: List of ...
- 开发专题指南: JEECG高速微云开发平台前言
JEECG微云高速开发平台-前言 1. 前言 1.1. 技术背景 随着WEB UI 框架(EasyUI/Jquery UI/Ext/DWZ)等的逐渐成熟,系统界面逐渐实现统一化,代码生成器也能够生成统 ...
- Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- ACPI电源管理中的S0 S1 S2 S3 S4 S5
电源选项中S0,S1,S2,S3,S4,S5的含义以 ACPI 的规格来说吧!ACPI(Advanced Configuration and Power Interface),即高级配置与电源接口.这 ...
- NeralJS需求整理及思路
NeralJs希望通过解析json数据,动态创建和渲染报表,每个报表呈现一定时间范围的数据,通过使用表格图表等不同的方式,使数据的呈现不死板,且更容易看出规律. 说通俗点,就是动态在一个区域内生成多张 ...
- (转)url重写
使用URLRewriter.dll后,根本不需要使用任何代码,我之前做的项目就是用的做URL重写的,其实不是进化,其实表面上看是.html扩展名而已,当然你还可以用其他的任意扩展名下面是你的配置 &l ...
- Android --------- 利用SharedPreferences存取数据
//向SharedPreferences中存放数据 //1.定义SharedPreferences对象,通过getSharedPreferences方法得到 SharedPreferences sp ...