解题关键:快速傅里叶变换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. LeetCode:二叉树相关应用

    LeetCode:二叉树相关应用 基础知识 617.归并两个二叉树 题目 Given two binary trees and imagine that when you put one of the ...

  2. CSS3图片悬停放大动画

    在线演示 本地下载

  3. linux通过脚本获取内存信息

    1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...

  4. 20165101刘天野 2018-2019-2《网络对抗技术》Exp8 Web基础

    20165101刘天野 2018-2019-2<网络对抗技术>Exp8 Web基础 1.实验内容 1.1 Web前端HTML (1)输入命令service apache2 start启动A ...

  5. ubuntu下搭建Scrapy框架简单办法

    1. 先执行以下命令 sudo apt-get install python-lxml sudo apt-get install libxslt1-dev sudo apt-get install p ...

  6. hdu 3308 线段树 区间合并+单点更新+区间查询

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. linux dd、echo 、watch、fuser命令

      一.dd命令 以数据流进行复制,cp命令则是以文件为单位进行复制 if=数据来源    of=数据存储目标    bs=# 复制的字节数   count=# 复制几个bs   seek=# 跳过多 ...

  8. python生成excel格式座位表

    脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...

  9. linux命令学习笔记(12):more命令

    more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便 使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就 ...

  10. 【遍历二叉树】01二叉树的前序遍历【Binary Tree Preorder Traversal】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,返回他的前序遍历的 ...