解题关键:快速傅里叶变换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模板题)的更多相关文章

  1. HDU 1402 A * B Problem Plus (FFT模板题)

    FFT模板题,求A*B. 用次FFT模板需要注意的是,N应为2的幂次,不然二进制平摊反转置换会出现死循环. 取出结果值时注意精度,要加上eps才能A. #include <cstdio> ...

  2. HDU - 1402 A * B Problem Plus FFT裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意: 求$a*b$ 但是$a$和$b$的范围可以达到 $1e50000$ 题解: 显然...用字符串模拟 ...

  3. 51nod 1028 大数乘法 V2 【FFT模板题】

    题目链接 模板题.. #include<bits/stdc++.h> using namespace std; typedef int LL; typedef double db; nam ...

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

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

  5. hdu 3549 Flow Problem 最大流问题 (模板题)

    Flow Problem Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  6. HDU1402 A * B Problem Plus FFT

    分析:网上别家的代码都分析的很好,我只是给我自己贴个代码,我是kuangbin的搬运工 一点想法:其实FFT就是快速求卷积罢了,当小数据的时候我们完全可以用母函数来做,比如那种硬币问题 FFT只是用来 ...

  7. HDU-1402 A * B Problem Plus FFT(快速傅立叶变化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 一般的的大数乘法都是直接模拟乘法演算过程,复杂度O(n^2),对于这题来说会超时.乘法的过程基本 ...

  8. UOJ#34 FFT模板题

    写完上一道题才意识到自己没有在博客里丢过FFT的模板-- 这道题就是裸的多项式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人这么写没有T),也可以各种其他分治乘法乱搞-- 所以我就直 ...

  9. [hdu3549]Flow Problem(最大流模板题)

    解题关键:使用的挑战程序设计竞赛上的模板,第一道网络流题目,效率比较低,且用不习惯的vector来建图. 看到网上其他人说此题有重边,需要注意下,此问题只在邻接矩阵建图时会出问题,邻接表不会存在的,也 ...

随机推荐

  1. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术

            服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器.集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任 ...

  2. HDU - 1114 Piggy-Bank 【完全背包】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1114 题意 给出一个储钱罐 不知道里面有多少钱 但是可以通过重量来判断 先给出空储钱罐的重量 再给出装 ...

  3. 浏览器对同一IP的最大并发请求数记录

    转载自http://www.iefans.net/liulanqi-zuida-bingfa-lianjieshu/,以方便查阅 版本 HTTP 1.0 服务器(宽带连接) HTTP 1.1 服务器( ...

  4. NGINX中遇到SELinux 13:permission denied

    被selinux坑了.抓包发现端口始终没有流量, 操作过程中还特地dmesg看了c并没发现selinux的异常. https://www.nginx.com/blog/using-nginx-plus ...

  5. Spark官网

    Components Spark applications run as independent sets of processes on a cluster, coordinated by the ...

  6. 百度地图省市县乡镇街道对应ZOOM级别

    百度地图省市县乡镇街道对应ZOOM级别

  7. 常见ETL工具一览,你知多少?

    这些年,几乎都与ETL打交道,接触过多种ETL工具.现将这些工具做个整理,与大家分享. 一 ETL工具[国外] 1. datastage点评:最专业的ETL工具,价格不菲,使用难度一般 下载地址:ft ...

  8. hibernate一级缓存和二级缓存的区别(转)

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  9. Python基础-网络编程request使用

    import requests#get请求 url = "http://127.0.0.1:8000/login" data={"username":" ...

  10. hbase_异常_01_Hbase: Failed to become active master

    一.异常现象 启动hbase之后,抛出异常,异常信息如下: master.HMaster: Failed to become active master hbase java.net.ConnectE ...