【模板】A*B Problem(FFT快速傅里叶)
题目:给出两个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快速傅里叶)的更多相关文章
- FFT快速傅里叶模板
FFT快速傅里叶模板…… /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < ...
- [Luogu 1919]【模板】A*B Problem升级版(FFT快速傅里叶)
Description 给出两个n位10进制整数x和y,你需要计算x*y. Input 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. Output 输出 ...
- luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
模板 嗯 做多项式乘法,进位 没了 #include<cmath> #include<cstdio> #include<cstring> #include<a ...
- Luogu P1919 【模板】A*B Problem升级版(FFT快速傅里叶_FFT
这其实就是一道裸的FFT 核心思想:把两个数拆成两个多项式用FFT相乘,再反序输出 py解法如下: input() print(int(input())*int(input())) 皮一下hihi f ...
- 洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
题目来源 吐槽下P3803都是紫题... 真心好写,本想一遍过的...但是 我真是太菜了... #include<bits/stdc++.h> using namespace std; ; ...
- P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...
- 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...
- 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
随机推荐
- Tomcat:Commons Daemon procrun stdout initialized
1.问题查询 更换了Tomcat版本后服务器无法启动,看日志出现了Commons Daemon procrun stdout initialized错误,一开始以为是环境变量的配置问题,但是仔细检查后 ...
- fineui grid自定义选项框 带全选
为什么要写这功能? 1 当你用可编辑列的时候,是不能用选择框的,这是ext设定的. 2 如果有不允许选择行,默认的选择框是没有这个功能的. 参考: 遍历asp.net控件 http://fineu ...
- 【题解】Luogu P5338 [TJOI2019]甲苯先生的滚榜
原题传送门 这题明显可以平衡树直接大力整,所以我要说一下线段树+树状数组的做法 实际线段树+树状数组的做法也很暴力 我们先用树状数组维护每个ac数量有多少个队伍.这样就能快速求出有多少队伍ac数比现在 ...
- 「UR#5」怎样跑得更快
「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...
- 洛谷 P1411 树 (树形dp)
大意: 给定树, 求删除一些边, 使得连通块大小的乘积最大 设$dp_{i,j}$表示只考虑点$i$的子树, $i$所在连通块大小为$j$的最大值. 转移的时候不计算$i$所在连通块的贡献, 留到最后 ...
- Java调用Http/Https接口(6)--RestTemplate调用Http/Https接口
RestTemplate是Spring提供的用于访问Http接口的客户端,提供同步的API:在将来的Spring版本中可能会过时,将逐渐被WebClient替代.文中所使用到的软件版本:Java 1. ...
- 【面试突击】-Redis常见面试题(一)
介绍:Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API的非关系型数据库. 传统数据 ...
- 【初识算法】- AC算法
原文地址:https://www.cnblogs.com/jily/p/6250716.html 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符 ...
- string 转stream和stream转string
string test = “Testing 1-2-3″; // convert string to stream MemoryStream stream = new MemoryStream(); ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装
以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...