Problem Description
Calculate A * B.
Input
Each line will contain two integers A and B. Process to end of file.

Note: the length of each integer will not exceed 50000.

Output
For each case, output A * B in one line.
Sample Input
1
2
1000
2
Sample Output
2
2000
Author
DOOM III
Recommend
DOOM III
 
【分析】
模板,不过我想说的是,这居然是06年的题目。。。太恐怖了。
 /*
宋代苏轼
《临江仙·夜饮东坡醒复醉》
夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣。敲门都不应,倚杖听江声。
长恨此身非我有,何时忘却营营。夜阑风静縠纹平。小舟从此逝,江海寄余生。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <iostream>
#include <string>
#include <ctime>
#define LOCAL
const double Pi = acos(-1.0);
const int MAXN = + ;
using namespace std;
typedef long long ll;
struct Num {
double a , b;
//构造函数
Num(double x = ,double y = ) {a = x; b = y;}
//复数的三种运算
Num operator + (const Num &c) {return Num(a + c.a, b + c.b);}
Num operator - (const Num &c) {return Num(a - c.a, b - c.b);}
Num operator * (const Num &c) {return Num(a * c.a - b * c.b, a * c.b + b * c.a);}
}x1[MAXN] , x2[MAXN]; //注意loglen为log后的长度
void change(Num *t, int len, int loglen){
//蝶形变换后的序列编号
for (int i = ; i < len; i++){
int x = i, k = ;
for (int j = ; j < loglen; j++, x >>= ) k = (k << ) | (x & );
if (k < i) swap(t[k], t[i]);
}
}
//基2-FFT
void FFT(Num *x, int len, int loglen){
change(x, len, loglen);
int t = ;
//t为长度
for (int i = ; i < loglen; i++, (t <<= )){
int l = , r = l + t;
while (l < len){
//初始化
Num a, b, wo(cos(Pi / t), sin(Pi / t)), wn(, );
for (int j = l; j < l + t; j++){
a = x[j];
b = x[j + t] * wn;
//蝶形计算
x[j] = a + b;
x[j + t] = a - b;
wn = wn * wo;
}
//注意是合并所以要走2t步
l = r + t;
r = l + t;
}
}
}
//离散傅里叶变换
void DFT(Num *x, int len, int loglen){
int t = (<<loglen);
for (int i = ; i < loglen; i++){
t >>= ;
int l = , r = l + t;
while (l < len){
Num a, b, wn(, ), wo(cos(Pi / t), -sin(Pi / t));
for (int j = l; j < l + t; j++){
a = x[j] + x[j + t];
b = (x[j] - x[j + t]) * wn;
x[j] = a;
x[j + t] = b;
wn = wn * wo;
}
l = r + t;
r = l + t;
}
}
change(x, len, loglen);
for (int i= ; i < len; i++) x[i].a /= len;
}
int solve(char *a, char *b){
int len1, len2, len, loglen;
int t, over;
len1 = strlen(a) << ;
len2 = strlen(b) << ;
len = ;
loglen = ;
while (len < len1) len <<= , loglen++;
while (len < len2) len <<= , loglen++;
//处理len1
for (int i = ; i < len; i++){
if (a[i]) x1[i].a = a[i] - '', x1[i].b = ;
else x1[i].a = x1[i].b = ;
}
for (int i = ; i < len; i++){
if (b[i]) x2[i].a = b[i] - '', x2[i].b = ;
else x2[i].a = x2[i].b = ;
}
FFT(x1, len, loglen);
FFT(x2, len, loglen);
for (int i = ; i < len; i++) x1[i] = x1[i] * x2[i]; DFT(x1, len, loglen);
over = len = ;
//转换成十进制的整数
for (int i = ((len1 + len2) / ) - ; i >= ; i--){
t = x1[i].a + over + 0.5;
a[len++] = t % ;
over = t / ;
}
while (over){
a[len++] = over % ;
over /= ;
}
return len;
}
//输出
void print(char *str, int len){
for(len--; len>= && !str[len];len--);
if(len < ) putchar('');
else for(;len>=;len--) putchar(str[len]+'');
printf("\n");
}
char a[MAXN] , b[MAXN]; int main() { //char a[MAXN], b[MAXN];
while(scanf("%s%s", a, b) != EOF) {
print(a, solve(a, b));
memset(a, , sizeof(a));
memset(b, , sizeof(b));
}
//printf("%.10lf\n", Pi);
return ;
}

【HDU1402】【FFT】A * B Problem Plus的更多相关文章

  1. 【BZOJ3527】【FFT】力

    [问题描述]给出n个数qi,给出Fj的定义如下:令Ei=Fi/qi.试求Ei.[输入格式]输入文件force.in包含一个整数n,接下来n行每行输入一个数,第i行表示qi.[输出格式]输出文件forc ...

  2. 【BZOJ4827】【HNOI2017】礼物(FFT)

    [BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...

  3. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  4. 【LOJ6067】【2017 山东一轮集训 Day3】第三题 FFT

    [LOJ6067][2017 山东一轮集训 Day3]第三题 FFT 题目大意 给你 \(n,b,c,d,e,a_0,a_1,\ldots,a_{n-1}\),定义 \[ \begin{align} ...

  5. BZOJ3527 [Zjoi2014]力 【fft】

    题目 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入格式 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. 输出格式 n行,第i行输出Ei.与标准答案误差不超过 ...

  6. 【LOJ2541】【PKUWC2018】猎人杀(容斥,FFT)

    [LOJ2541][PKUWC2018]猎人杀(容斥,FFT) 题面 LOJ 题解 这题好神仙啊. 直接考虑概率很麻烦,因为分母总是在变化. 但是,如果一个人死亡之后,我们不让他离场,假装给他打一个标 ...

  7. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  8. 【UOJ#50】【UR #3】链式反应(分治FFT,动态规划)

    [UOJ#50][UR #3]链式反应(分治FFT,动态规划) 题面 UOJ 题解 首先把题目意思捋一捋,大概就是有\(n\)个节点的一棵树,父亲的编号大于儿子. 满足一个点的儿子有\(2+c\)个, ...

  9. 【LOJ#575】【LNR#2】不等关系(容斥,动态规划,分治FFT)

    [LOJ#575][LNR#2]不等关系(容斥,动态规划,分治FFT) 题面 LOJ 题解 一个暴力\(dp\),设\(f[i][j]\)表示考虑完了前\(i\)个位置,其中最后一个数在前面所有数中排 ...

  10. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

随机推荐

  1. 荷兰国旗问题 划分成3部分 leecode

    public class Solution { public void sortColors(int[] A) { int len=A.length; int beg=0; int end=len-1 ...

  2. Android JNI 由C/C++本地代码向Java层传递数据

    最近做的Android项目需要调用C代码,进行串口通信及与硬件设备通信,因此要用到JNI,其中本地代码需要向Java层返回三个参数,分别为 参数一:int型: 参数二: 通信指令,本地代码中为unsi ...

  3. C语言宏定义函数中的“_##”的意思

    最近在看google vp9的代码的时候碰到: #define intra_pred_sized(type, size) \ void vp9_##type##_predictor_##size##x ...

  4. 动态规划---最长公共子序列 hdu1159

    hdu1159 题目要求两个字符串最长公共子序列, 状态转换方程   f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时 f[i][j]=MAX{f[i-1][j],f[i][j-1] ...

  5. div border-radius画圆

    不要指定border-width属性: <html> <style type="text/css"> div{ border-style: solid; b ...

  6. typeof和instanceof 运算符

    instanceof运算符与typeof运算符相似,用于识别正在处理的对象的类型,但是在使用 typeof 运算符时采用引用类型存储值会出现一个问题. 无论引用的是什么类型的对象,它都返回 " ...

  7. SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)

    最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...

  8. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

  9. windows修改mysql默认字符集不成功

    今天下午弄了半天,终于把mysql的默认字符集弄成了, 按照网上的说法,什么修改mysql下面的my.ini文件,把参数设置成utf-8,我反复操作,结果都是不成功,后来我把mysql5.0卸载了,网 ...

  10. GitHub与Versions

    [第一步]建立先仓库 第一步的话看一般的提示就知道了,在github新建一个repository(谷歌可以解决),都是可视化的界面操作,所以难度不大.或者看这里:https://help.github ...