【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述
给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919)
分析
假设已经学会了FFT/NTT。
高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时。
例如n=3,求123*111
$$123 = x^2 + 2x + 3$$
$$111 = x^2 + x +1$$
$$\begin{aligned}123 * 111 &= (x^2 + 2x + 3)(x^2 + x +1)\\ &= x^4 + 3x^3 + 6x^2 + 5x + 3\\ &= 13653\end{aligned}$$
代码:
#include<bits/stdc++.h>
#define rg register
using namespace std; typedef long long ll;
const int mod=,g=;
const int maxn = 6e4 + ; inline int qpow(int x,int k)
{
int ans=;
while(k)
{
if(k&)
ans=(ll)ans*x%mod;
x=(ll)x*x%mod,k>>=;
}
return ans;
} inline int module(int x,int y)
{
x+=y;
if(x>=mod)
x-=mod;
return x;
} int rev[*maxn];
inline void NTT(int*t,int lim,int type)
{
for(rg int i=;i<lim;++i)
if(i<rev[i])
swap(t[i],t[rev[i]]);
for(rg int i=;i<lim;i<<=)
{
int gn=qpow(g,(mod-)/(i<<));
if(type==-)
gn=qpow(gn,mod-);
for(rg int j=;j<lim;j+=(i<<))
{
int gi=;
for(rg int k=;k<i;++k,gi=(ll)gi*gn%mod)
{
int x=t[j+k],y=(ll)gi*t[j+i+k]%mod;
t[j+k]=module(x,y);
t[j+i+k]=module(x,mod-y);
}
}
}
if(type==-)
{
int inv=qpow(lim,mod-);
for(rg int i=;i<lim;++i)
t[i]=(ll)t[i]*inv%mod;
}
} int X[*maxn],Y[*maxn];
inline void mul(int*x, int*y, int n, int m)
{
memset(X,,sizeof(X));
memset(Y,,sizeof(Y));
int lim = , L = ; //L=0必须写,局部变量默认值很可能不是0
while(lim <= n + m) lim <<= , L++; //lim为大于(n+m)的2的幂,所以最多需要4倍空间
for(int i = ; i < lim; i++) rev[i] = (rev[i >> ] >> ) | ((i & ) << (L - ));
for(rg int i=;i<lim;++i) X[i]=x[i],Y[i]=y[i];
NTT(X,lim,);
NTT(Y,lim,);
for(rg int i=;i<lim;++i) X[i]=(ll)X[i]*Y[i]%mod;
NTT(X,lim,-);
for(rg int i=;i<lim;++i) x[i]=X[i];
} int n;
int a[*maxn], b[*maxn];
char s[maxn]; int main()
{
scanf("%d", &n);
scanf("%s", s);
for(int i = ;i < n;i++) a[i] = s[n--i] - '';
scanf("%s", s);
for(int i = ;i < n;i++) b[i] = s[n--i] - '';
mul(a, b, n, n); // for(int i = 0;i < 2*n;i++) printf("%d ", a[i]);
// printf("\n"); int tmp = ; //进位
for(int i = ;i < *n;i++) //
{
a[i] = a[i] + tmp;
tmp = a[i] / ;
a[i] = a[i] % ; } // for(int i = 0;i < 2*n;i++) printf("%d ", a[i]);
// printf("\n"); bool flag = true;
for(int i = *n;i >= ;i--) //逆序输出,去掉前导零
{
if(flag && a[i] == ) continue;
printf("%d", a[i]);
flag = false;
} return ;
}
【模板】A*B Problem升级版(FFT快速傅里叶)的更多相关文章
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- P1919 【模板】A*B Problem升级版 /// FFT模板
题目大意: 给定l,输入两个位数为l的数A B 输出两者的乘积 FFT讲解 这个讲解蛮好的 就是讲解里面贴的模板是错误的 struct cpx { double x,y; cpx(double _x= ...
- 【模板】A*B Problem(FFT快速傅里叶)
题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...
- FFT快速傅里叶模板
FFT快速傅里叶模板…… /* use way: assign : h(x) = f(x) * g(x) f(x):len1 g(x):len2 1. len = 1; while(len < ...
- luoguP1919 A*B Problem升级版 ntt
luoguP1919 A*B Problem升级版 链接 luogu 思路 ntt模板题 代码 #include <bits/stdc++.h> #define ll long long ...
- 【luogu P3803】【模板】多项式乘法(FFT)
[模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...
- hdu 1402 A * B Problem Plus FFT
/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
- 2018.08.28 洛谷P3803 【模板】多项式乘法(FFT)
传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdi ...
随机推荐
- PAT甲级 图 相关题_C++题解
图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...
- 给内部类对象数组属性赋值时报错:Exception in thread "main" java.lang.NullPointerException
前言 1255: 打怪升级(Java),写这个题目程序的时候,控制台提示如下错误: Exception in thread "main" java.lang.NullPointer ...
- 1192: 零起点学算法99——The sum problem(C)
一.题目 http://acm.wust.edu.cn/problem.php?id=1192&soj=0 二.分析 要求从序列1,2,3,,,N,中截取一部分使他们的和为M 输入多组数据 输 ...
- SAS学习笔记6 算数语句(sum、mean、min、max函数)
sum:求和 mean:平均值 min:最小值 max:最大值
- CentOS7离线安装Mysql(详细安装过程)
Mysql安装 下载mysql离线安装包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle ...
- SVN操作出现locked错误解决办法
SVN操作出现locked错误解决办法:在SVN中执行 commit 操作时,在更新过程中,中断过,或者因为其他原因导致SVN 出现 locked 异常. 解决办法:1. 选中出现异常的文件,右键 - ...
- 写文章 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...
- sql注入测试(3)---现象分析
那为什么出现以上问题呢?这是程序代码层控制不当导致的.如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用 ...
- Bootstrap3 CDN 使用手册
一.一般功能 <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css" rel=" ...
- sqlyog无操作一段时间后重新操作会卡死问题
在使用 sqlyog 的过程中,遇到了这种情况:打开一个连接,进行了一些操作之后,过一段时间没有操作,然后再来操作会卡死一段时间,等一段时间后操作完成了继续进行其它操作,又很流畅了.但是过一段时间不操 ...