[hdu1402]A * B Problem Plus(FFT模板题)
解题关键:快速傅里叶变换fft练习。
关于结果多项式长度的确定,首先将短多项式扩展为长多项式,然后扩展为两倍。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<complex>
#define N 131072
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
typedef complex<double> E;
int n,m,L;
char ch1[N],ch2[N];
int R[N],c[N];
E a[N],b[N];
//高效迭代实现fft
void fft(E *a,int f){
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);//位逆序置换
for(int i=;i<n;i<<=){
E wn(cos(pi/i),f*sin(pi/i));
for(int j=;j<n;j+=(i<<)){
E w(,);
for(int k=;k<i;k++,w*=wn){//蝴蝶操作
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;a[j+k+i]=x-y;
}
}
}
if(f==-)for(int i=;i<n;i++)a[i]/=n;
} int main(){
while(scanf("%s%s",ch1,ch2)!=EOF){
memset(a,,sizeof a);
memset(b,,sizeof b);
memset(c,,sizeof c);
L=;
int len1=strlen(ch1),len2=strlen(ch2);
for(int i=;i<len1;i++)a[i]=ch1[len1-i-]-'';
for(int i=;i<len2;i++)b[i]=ch2[len2-i-]-'';
for(n=;n<*len1||n<*len2;n<<=)L++;
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));//打印逆序表
fft(a,);fft(b,);//dft
for(int i=;i<n;i++)a[i]*=b[i];
fft(a,-);//idft
for(int i=;i<n;i++)c[i]=(int)(a[i].real()+0.1);
for(int i=;i<n;i++)
if(c[i]>=){
c[i+]+=c[i]/,c[i]%=;
}
while(n>&&!c[n]) n--;
for(;n>=;--n) printf("%d",c[n]);
puts("");
}
return ;
}
memset改一下。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<complex>
#define N 131072
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
typedef complex<double> E;
int n,m,L;
char ch1[N],ch2[N];
int R[N],c[N];
E a[N],b[N];
//高效迭代实现fft
void fft(E *a,int f){
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);//位逆序置换
for(int i=;i<n;i<<=){
E wn(cos(pi/i),f*sin(pi/i));
for(int j=;j<n;j+=(i<<)){
E w(,);
for(int k=;k<i;k++,w*=wn){//蝴蝶操作
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;a[j+k+i]=x-y;
}
}
}
if(f==-)for(int i=;i<n;i++)a[i]/=n;
} int main(){
while(scanf("%s%s",ch1,ch2)!=EOF){
memset(c,,sizeof c);
int len1=strlen(ch1),len2=strlen(ch2);
L=;
for(n=;n<*len1||n<*len2;n<<=)L++;
for(int i=;i<n;i++) a[i]=b[i]=;
for(int i=;i<len1;i++)a[i]=ch1[len1-i-]-'';
for(int i=;i<len2;i++)b[i]=ch2[len2-i-]-'';
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));//打印逆序表
fft(a,);fft(b,);//dft
for(int i=;i<n;i++)a[i]*=b[i];
fft(a,-);//idft
for(int i=;i<n;i++)c[i]=(int)(a[i].real()+0.1);
for(int i=;i<n;i++)
if(c[i]>=){
c[i+]+=c[i]/,c[i]%=;
}
while(n>&&!c[n]) n--;
for(;n>=;--n) printf("%d",c[n]);
puts("");
}
return ;
}
最后试了下,len1+len2就可以。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<complex>
#define N 131072
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
typedef complex<double> E;
int n,m,L;
char ch1[N],ch2[N];
int R[N],c[N];
E a[N],b[N];
//高效迭代实现fft
void fft(E *a,int f){
for(int i=;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);//位逆序置换
for(int i=;i<n;i<<=){
E wn(cos(pi/i),f*sin(pi/i));
for(int j=;j<n;j+=(i<<)){
E w(,);
for(int k=;k<i;k++,w*=wn){//蝴蝶操作
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y;a[j+k+i]=x-y;
}
}
}
if(f==-)for(int i=;i<n;i++)a[i]/=n;
} int main(){
while(scanf("%s%s",ch1,ch2)!=EOF){
memset(c,,sizeof c);
int len1=strlen(ch1),len2=strlen(ch2);
L=;
for(n=;n<len1+len2;n<<=)L++;
for(int i=;i<=n;i++) a[i]=b[i]=;
for(int i=;i<len1;i++)a[i]=ch1[len1-i-]-'';
for(int i=;i<len2;i++)b[i]=ch2[len2-i-]-'';
for(int i=;i<n;i++)R[i]=(R[i>>]>>)|((i&)<<(L-));//打印逆序表
fft(a,);fft(b,);//dft
for(int i=;i<n;i++)a[i]*=b[i];
fft(a,-);//idft
for(int i=;i<n;i++)c[i]=(int)(a[i].real()+0.1);
for(int i=;i<n;i++)
if(c[i]>=){
c[i+]+=c[i]/,c[i]%=;
}
while(n>&&!c[n]) n--;
for(;n>=;--n) printf("%d",c[n]);
puts("");
}
return ;
}
[hdu1402]A * B Problem Plus(FFT模板题)的更多相关文章
- HDU 1402 A * B Problem Plus (FFT模板题)
FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...
- HDU - 1402 A * B Problem Plus FFT裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...
- 51nod 1028 大数乘法 V2 【FFT模板题】
题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; nam ...
- P1919 【模板】A*B Problem升级版 /// FFT模板
题目大意: 给定l,输入两个位数为l的数A B 输出两者的乘积 FFT讲解 这个讲解蛮好的 就是讲解里面贴的模板是错误的 struct cpx { double x,y; cpx(double _x= ...
- hdu 3549 Flow Problem 最大流问题 (模板题)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- HDU1402 A * B Problem Plus FFT
分析:网上别家的代码都分析的很好,我只是给我自己贴个代码,我是kuangbin的搬运工 一点想法:其实FFT就是快速求卷积罢了,当小数据的时候我们完全可以用母函数来做,比如那种硬币问题 FFT只是用来 ...
- HDU-1402 A * B Problem Plus FFT(快速傅立叶变化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 一般的的大数乘法都是直接模拟乘法演算过程,复杂度O(n^2),对于这题来说会超时.乘法的过程基本 ...
- UOJ#34 FFT模板题
写完上一道题才意识到自己没有在博客里丢过FFT的模板-- 这道题就是裸的多项式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人这么写没有T),也可以各种其他分治乘法乱搞-- 所以我就直 ...
- [hdu3549]Flow Problem(最大流模板题)
解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图. 看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也 ...
随机推荐
- LeetCode:盛最多水的容器【11】
LeetCode:盛最多水的容器[11] 题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 ...
- MYSQL:基础——触发器
MYSQL基础——触发器 引入触发器 什么是触发器 如果你想要某条语句(或某些语句)在事件发生时自动执行.比如: 每当订购一个产品时,都从库存数量中减去订购的数量:无论何时删除一行,都在某个存档表中保 ...
- mysql主从复制(windows下)
简单搭建mysql主从服务器(双向复制),仅供学习之用. 1.下载mysql-advanced-5.6.16-winx64.zip 下载完成后解压,重命名成mysql,分别放入两台服务器(看第二点集群 ...
- 【Flask】SelectedField 同步数据库
## 如果不加入__init__函数会导致,SelectedField表单生成只有里面的内容不会和数据库同步(即数据库添加,删除字段时表单中数据项和初始化时一致.下一次重启app是才会同步) clas ...
- 浅谈Android系统开发中LOG的使用【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以 ...
- Linux iptables 从入门到放弃
iptables表(iptables)和链(chains) 描述完iptables术语后,相信大家对iptables的表和链有了初步的了解.默认情况下,Iptables根据功能和表的定义划分包含 ...
- POJ2253 frogger 最短路 floyd
#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#inc ...
- [转]Tomcat启动分析
[转]Tomcat启动分析 原帖 http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html 以下摘录了部分 --------------- ...
- Openldap- 大机群身份验证服务
无论在哪个行业,数据安全永远都是摆在首要地位.尤其是在大数据行业上,谁掌握了数据,谁就有可能成为下个亿万富豪的环境中,数据安全更为重要.大数据的安全可以从哪些地方入手,首先可以在身份验证上面入手.在大 ...
- 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc
基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...