题目描述

给出两个 $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快速傅里叶)的更多相关文章

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

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

  2. P1919 【模板】A*B Problem升级版 /// FFT模板

    题目大意: 给定l,输入两个位数为l的数A B 输出两者的乘积 FFT讲解 这个讲解蛮好的 就是讲解里面贴的模板是错误的 struct cpx { double x,y; cpx(double _x= ...

  3. 【模板】A*B Problem(FFT快速傅里叶)

    题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...

  4. 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)

    洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...

  5. FFT快速傅里叶模板

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

  6. luoguP1919 A*B Problem升级版 ntt

    luoguP1919 A*B Problem升级版 链接 luogu 思路 ntt模板题 代码 #include <bits/stdc++.h> #define ll long long ...

  7. 【luogu P3803】【模板】多项式乘法(FFT)

    [模板]多项式乘法(FFT) 题目链接:luogu P3803 题目大意 给你两个多项式,要你求这两个多项式乘起来得到的多项式.(卷积) 思路 系数表示法 就是我们一般来表示一个多项式的方法: \(A ...

  8. hdu 1402 A * B Problem Plus FFT

    /* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才 ...

  9. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

  10. 2018.08.28 洛谷P3803 【模板】多项式乘法(FFT)

    传送门 fft模板题. 终于学会fft了. 这个方法真是神奇! 经过试验发现手写的complex快得多啊! 代码: #include<iostream> #include<cstdi ...

随机推荐

  1. S2. Android 常用控件

    [概述] Button(普通按钮):点击事件处理 Toast(消息提示) Menu(菜单): Menu + Fragment 实现菜单切换 [Button] 在 MainActivity 对应的布局文 ...

  2. K8S从入门到放弃系列-(10)kubernetes集群之kube-proxy部署

    摘要: kube-proxy的作用主要是负责service的实现,具体来说,就是实现了内部从pod到service和外部的从node port向service的访问 新版本目前 kube-proxy ...

  3. Python_OpenCV视频截取并保存

    在图像处理之前,我们需要对拿到手的数据进行筛选,对于视频,我们需要从中截取我们需要的一段或几段 整体思路比较简单,通过设定截取视频的起止时间(帧数),可以将该时间段内的图像保存为新的视频 直接上代码: ...

  4. python3 获取自建gitlab用户提交信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-12-03 14:20 # @Author : Anthony # @Emai ...

  5. GB18030 字符集

    gb18030 编辑 国家标准GB18030-2005<信息技术 中文编码字符集>是我国继GB2312-1980和GB13000.1-1993之后最重要的汉字编码标准,是我国计算机系统必须 ...

  6. java中如何测试一段代码的运行时间

    一.以毫秒为单位.long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime ...

  7. Activate注解

    Activate注解 被该注解修饰的接口,扩展类可能会被加载 ProtocolFilterWrapper.buildInvokerChain @Documented @Retention(Retent ...

  8. 一文搞懂嵌入式uboot、kernel、文件系统的关系

    总览: 在linux系统软件架构可以分为4个层次(从低到高分别为):   1.引导加载程序         引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一 ...

  9. 2019杭电多校二 F. Fantastic Magic Cube (FWT)

    大意: 给定$N^3$立方体, 每个单位立方体权值为三个坐标异或, 每次沿坐标轴切一刀, 得分为两半内权值和的乘积, 求切成$n^3$块的最大得分. 可以发现得分与切法无关, 假设每个点权值为$a_i ...

  10. 怎样理解new命令的执行过程

    通过new命令生成一个实例对象经历了四个步骤: 1. 创建一个空对象, 作为将要返回的实例; 2. 将空对象的原型指向构造函数的prototype属性; 3. 将空对象赋值给构造函数的this; 4. ...