洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
刚学了FFT,我们来刷一道模板题。
题目描述
给定两个长度为 n 的两个十进制数,求它们的乘积。
n<=100000
如果用 n^2 暴力,肯定会 TLE。
我们把这两个数看成一个多项式。
f(x)=a0+a1*101+a2*102+a3*103+ ...... +an-1*10n-1
然后就可以愉快的FFT求解了!!
#include<iostream>
#include<cmath>
#include<complex>
#include<cstdio>
using namespace std; const double PI=acos(-);
typedef complex<double> cmplx;
int rev[];
cmplx a[],b[];
int n,bit=,output[];
char s1[],s2[]; void get_rev(){
for(int i=;i<bit;i++)
rev[i]=(rev[i>>]>>)|(bit>>)*(i&);
} void FFT(cmplx *a,int dft){
for(int i=;i<bit;i++)
if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=;i<bit;i<<=){
cmplx W=exp(cmplx(,dft*PI/i));
for(int j=;j<bit;j+=i<<){
cmplx w(,);
for(int k=j;k<j+i;k++,w*=W){
cmplx x=a[k];
cmplx y=w*a[k+i];
a[k]=x+y;
a[k+i]=x-y;
}
}
}
if(!~dft)for(int i=;i<bit;i++)a[i]/=bit;
} int main(){
scanf("%d%s%s",&n,s1,s2);
for(int i=;(<<i)<=*n;i++)bit<<=;
for(int i=;i<n;i++){
a[i]=s1[n-i-]-'';
b[i]=s2[n-i-]-'';
}
get_rev();
FFT(a,),FFT(b,);
for(int i=;i<bit;i++)a[i]=a[i]*b[i];
FFT(a,-);
for(int i=;i<bit;i++){ //确保输出为十进制
output[i]+=a[i].real()+0.5;
output[i+]+=output[i]/;
output[i]%=;
}
bool check=false;
for(int i=n<<;i>=;i--){ //去前导零输出
if(check||output[i]){
printf("%d",output[i]);
check=true;
}
}
if(!check)printf("");
}
洛谷P1919 【模板】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升级版
题目大意:rt 题解:将长度为 N 的大整数看作是一个 N-1 次的多项式,利用 FFT 计算多项式的卷积即可. 代码如下 #include <bits/stdc++.h> using n ...
- 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数为n的正整数y. 输出格式: 输出一 ...
- 洛谷P1919 A*B problem 快速傅里叶变换模板 [FFT]
题目传送门 A*B problem 题目描述 给出两个n位10进制整数x和y,你需要计算x*y. 输入输出格式 输入格式: 第一行一个正整数n. 第二行描述一个位数为n的正整数x. 第三行描述一个位数 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
随机推荐
- android api 镜像站
项目地址:https://github.com/msdx/androiddoc 访问短址: http://androiddoc.qiniudn.com/
- UE4帧动画Matineed
发一句牢骚,ue4除了渲染好一点,其他操作都没有unity便利,最近需要在项目中,调几个简单的动画使用到了Matineed,相当不好用.也可能是unity转ue4,有先入为主的观念,哈哈,never ...
- Java-IO之对象输入流输出流(ObjectInputStream和ObjectOutputStream)
ObjectInputStream和ObjectOutputStream的作用是对基本数据和对象进行序列化操作支持.创建文件输出流对应的ObjectOutputStream对象,该ObjectOutp ...
- Chapter 3 Protecting the Data(4):创建和使用应用程序角色
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39927713,专题目录:http://blog.csdn.net/dba_huangzj ...
- EBS条形码打印
Oracle 提供两种方式实现 128 码的编码 第一种方式是使用 Reports Builder 实现对 128 码编码, 在 Metalink 305090.1[1] 有 比较详尽的描述,其中 ...
- CodePen最佳实例分享
原文地址: Chris Coyier's Favorite CodePen Demos 原文日期: 2013年8月13日 翻译日期: 2013年8月21日 CodePen: Build, Explor ...
- 《java入门第一季》之Random类和获取随机数案例
/* * Random:产生随机数的类 * * 构造方法: * public Random():没有给种子,用的是默认种子,是当前时间的毫秒值下的随机数,所以会一直变化 * public ...
- NDK开发环境安装,CDT安装,Cygwin安装
1.为eclipse增加c和c++的开发插件 Help中的install new software 选择 Helios-http://download.eclipse.org/release/h ...
- Python学习笔记 - 生成器generator
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # generator 生成器 L = [x * x for x in range(10)] print( ...
- cygwin 下安装python MySQLdb
cygwin 下安装python MySQLdb 1) cygwin 更新 运行 cygwin/setup-x86_64.exe a 输入mysql,选择下面的包安装: libmysqlclient- ...