题目:给出两个n位10进制整数x和y,你需要计算x*y。($n \leq 60000$)

分析:

两个正整数的相乘可以视为两个多项式的相乘,

例如 $15 \times 16 = 240$,

可写成 $(5+x)*(6+x) = 30 + 11x + x^2$,$x=10$

这样得到多项式 $A(x)$ 和 $B(x)$,并且能用FFT求出 $C(x)=A(x)B(x)$,

怎么得到最终结果,我们要将 $x=10$ 代入吗?

$n$ 这么大,遍历一遍也没有这么大的数据类型能存下,其次,这也不是必要的。

$x=10$ 是 $C(x)$ 已经相当于十进制,我们模拟一下进位就可以了。

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN = * + ;
inline int read() {
char c = getchar(); int x = , f = ;
while (c < '' || c > '') {if (c == '-')f = -; c = getchar();}
while (c >= '' && c <= '') {x = x * + c - ''; c = getchar();}
return x * f;
}
const double Pi = acos(-1.0);
const double Eps = 1e-;
double ccos[MAXN], ssin[MAXN];
struct complex {
double x, y;
complex (double xx = , double yy = ) {x = xx, y = yy;}
} a[MAXN], b[MAXN];
complex operator + (complex a, complex b) { return complex(a.x + b.x , a.y + b.y);}
complex operator - (complex a, complex b) { return complex(a.x - b.x , a.y - b.y);}
complex operator * (complex a, complex b) { return complex(a.x * b.x - a.y * b.y , a.x * b.y + a.y * b.x);} //不懂的看复数的运算那部分
void fast_fast_tle(int limit, complex *a, int type) {
if (limit == ) return ; //只有一个常数项
complex a1[limit >> ], a2[limit >> ];
for (int i = ; i < limit; i += ) //根据下标的奇偶性分类
a1[i >> ] = a[i], a2[i >> ] = a[i + ];
fast_fast_tle(limit >> , a1, type);
fast_fast_tle(limit >> , a2, type);
complex Wn = complex(ccos[limit] , type * ssin[limit]), w = complex(, );
//complex Wn = complex(cos(2.0 * Pi / limit) , type * sin(2.0 * Pi / limit)), w = complex(1, 0);
//Wn为单位根,w表示幂
for (int i = ; i < (limit >> ); i++, w = w * Wn) //这里的w相当于公式中的k
{
complex tmp = w * a2[i];
a[i] = a1[i] + tmp;
a[i + (limit >> )] = a1[i] - tmp; //利用单位根的性质,O(1)得到另一部分
}
} char s[MAXN];
int res[MAXN]; int main() {
int N = read();
scanf("%s", s);
for (int i = ; i < N; i++) a[i].x = s[N--i]-'';
scanf("%s", s);
for (int i = ; i < N; i++) b[i].x = s[N--i]-''; //for(int i = 0;i < N;i++) printf("%f ", a[i]); int limit = ; while (limit <= *N) limit <<= ; for(int i = ;i <= limit;i++)
{
ccos[i] = cos(2.0 * Pi / i);
ssin[i] = sin(2.0 * Pi / i);
} fast_fast_tle(limit, a, );
fast_fast_tle(limit, b, );
//后面的1表示要进行的变换是什么类型
//1表示从系数变为点值
//-1表示从点值变为系数
//至于为什么这样是对的,可以参考一下c向量的推导过程,
for (int i = ; i <= limit; i++)
a[i] = a[i] * b[i];
fast_fast_tle(limit, a, -); for(int i = ;i <= *N;i++) res[i] = int(a[i].x/limit+0.5); int tmp = ; //进位
for(int i = ;i <= *N;i++)
{
res[i] += tmp;
tmp = res[i] / ;
res[i] = res[i] % ;
} bool flag = false;
for (int i = *N; i >= ; i--)
{
if(res[i]) flag = true; //注意处理前导0,题干有说
if(flag) printf("%d", res[i]); //按照我们推倒的公式,这里还要除以n
}
return ;
}

【模板】A*B Problem(FFT快速傅里叶)的更多相关文章

  1. FFT快速傅里叶模板

    FFT快速傅里叶模板…… /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < ...

  2. [Luogu 1919]【模板】A*B Problem升级版(FFT快速傅里叶)

    Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...

  3. luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...

  4. Luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶_FFT

    这其实就是一道裸的FFT 核心思想:把两个数拆成两个多项式用FFT相乘,再反序输出 py解法如下: input() print(int(input())*int(input())) 皮一下hihi f ...

  5. 洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目来源 吐槽下P3803都是紫题... 真心好写,本想一遍过的...但是 我真是太菜了... #include<bits/stdc++.h> using namespace std; ; ...

  6. P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...

  7. 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...

  8. 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...

  9. 洛谷.1919.[模板]A*B Problem升级版(FFT)

    题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...

随机推荐

  1. python requests 超时与重试

    一 源起: requests模块作为python爬虫方向的基础模块实际上在日常实际工作中也会涉及到,比如用requests向对方接口url发送POST请求进行推送数据,使用GET请求拉取数据. 但是这 ...

  2. python笔记:删除列表元素和根据索引查找元素

    查找元素 #查找元素 >>> member=['张三','李四','王五','张麻子'] >>> member[0] '张三' #交换元素 >>> ...

  3. 一张图看懂SharpCapture

    通过下面的图片,可以瞬间看懂整个类库的脉络.

  4. [JLOI2014]松鼠的新家 (树剖)

    题目 P3258 [JLOI2014]松鼠的新家 解析 非常裸的一道树剖题 链上修改+单点查询的板子 记录一下所经过的点\(now[i]\),每次更新\(now[i-1]到now[i]\) 我们链上更 ...

  5. 一个非常有趣的爬虫小练习带ocr识别的

    有个小的想法,想找一找 形近字 .百度一搜索,百度文库有一个,收费4元.而且我觉得字数不是太多.想自己弄一个,于是找到了 这个网站 http://www.fantiz5.com/xingjinzi/ ...

  6. 复杂dic的文件化存储和读取问题

    今天遇到一个难题.整出一个复杂的dic,里面不仅维度多,还含有numpy.array.超级复杂.过程中希望能够存储一下,万一服务器停了呢?万一断电了呢? 结果存好存,取出来可就不是那样了.网上搜索了很 ...

  7. 基于xilinx Zynq UltraScale MPSoC平台的核心板及开发板介绍-米尔科技

    近日,米尔科技推出国内首款基于xilinx Zynq UltraScale+MPSoC 平台的核心板及开发板.其优势主要有:采用16纳米制程,相比Znyq7000系列每瓦性能提升5倍,且单芯片融合4核 ...

  8. WPF弹出进度条

    环境:vs2015 ,.net 4.6 源码地址:https://pan.baidu.com/s/1FoujUMst1luomPf0ZfCLUQ 提取码:trzj 说明: 1.进度条是在winFrom ...

  9. Openlayers学习开始前序

    Openlayers将抽象事物具体化为类,其核心类是Map.Layers.Source.View,几乎所有的动作都是围绕这几个核心类展开.Map的实例就是内嵌于网页的交互式地图,因此,最关键的是Map ...

  10. Python使用numpy进行数据转换

    一.测试数据 二.代码实现 # -*- coding: utf-8 -*- """ Created on Sun Jul 7 11:35:01 2019 加载数据时对指定 ...