FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
Input
Note: the length of each integer will not exceed 50000.
Output
Sample Input
1
2
1000
2
Sample Output
2
2000
唉,模板题,膜的邝斌的模板。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const double PI = acos(-1.0); struct complex{
double r,i;
complex(double r_=0.0,double i_=0.0)
{
r=r_;i=i_;
}
complex operator +(const complex &b)
{
return complex(r+b.r,i+b.i);
}
complex operator -(const complex &b)
{
return complex(r-b.r,i-b.i);
}
complex operator *(const complex &b)
{
return complex(r*b.r-i*b.i,i*b.r+r*b.i);
}
}; void Rader(complex *a,int len)
{
int k;
for(int i=,j=len/;i<len-;i++)
{
if(i<j)swap(a[i],a[j]);
k=len/;
while(j>=k)
{
j-=k;
k>>=;
}
j+=k;
}
} void FFT(complex *a,int len,int on)
{
Rader(a,len);
for(int h=;h<=len;h<<=)
{
complex wn(cos(-on**PI/h),sin(-on**PI/h));
for(int j=;j<len;j+=h)
{
complex w(,);
for(int k=j;k<j+h/;k++)
{
complex u=a[k];
complex v=a[k+h/]*w;
a[k]=u+v;
a[k+h/]=u-v;
w=w*wn;
}
}
}
if(on==-)
for(int i=;i<len;i++)
a[i].r/=len;
} const int maxn = ;
complex Array1[maxn],Array2[maxn];
char str1[maxn],str2[maxn];
int sum[maxn],len,len1,len2; int main()
{
while(~scanf("%s%s",str1,str2))
{
len1=strlen(str1);
len2=strlen(str2);
len=;
while(len<len1*||len<len2*)len<<=;
for(int i=;i<len1;i++)
Array1[i]=complex(str1[len1-i-]-'',);
for(int i=;i<len2;i++)
Array2[i]=complex(str2[len2-i-]-'',); for(int i=len1;i<len;i++)
Array1[i]=complex(,);
for(int i=len2;i<len;i++)
Array2[i]=complex(,); FFT(Array1,len,);
FFT(Array2,len,);
for(int i=;i<len;i++)
Array1[i]=Array1[i]*Array2[i];
FFT(Array1,len,-);
memset(sum,,sizeof(sum));
for(int i=;i<len;i++){
sum[i]+=(int)(Array1[i].r+0.5);
sum[i+]+=sum[i]/;
sum[i]%=;
}
int p=len;
while(!sum[p]&&p)p--;
for(;p!=-;p--)
printf("%d",sum[p]);
printf("\n");
}
return ;
}
两个月后重打了一遍。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=;
const double PI=acos(-1.0);
struct complex{
double r,i;
complex(double r_=0.0,double i_=0.0){
r=r_;i=i_;
}
complex operator +(complex a){
return complex(r+a.r,i+a.i);
}
complex operator -(complex a){
return complex(r-a.r,i-a.i);
}
complex operator *(complex a){
return complex(r*a.r-i*a.i,r*a.i+a.r*i);
}
}A[maxn],B[maxn]; void Rader(complex *a,int len){
int k;
for(int i=,j=len>>;i<len-;i++){
if(i<j)swap(a[i],a[j]);
k=len>>;
while(j>=k){
j-=k;
k>>=;
}
j+=k;
}
} void FFT(complex *a,int len,int on){
Rader(a,len);
for(int h=;h<=len;h<<=){
complex wn(cos(-on*PI*2.0/h),sin(-on*PI*2.0/h));
for(int j=;j<len;j+=h){
complex w(,);
for(int k=j;k<j+(h>>);k++){
complex x=a[k];
complex y=a[k+(h>>)]*w;
a[k]=x+y;
a[k+(h>>)]=x-y;
w=w*wn;
}
}
}
if(on==-)
for(int i=;i<len;i++)
a[i].r/=len;
return;
} char s[maxn],t[maxn];
int ans[maxn];
int main(){
while(~scanf("%s%s",s,t)){
int lens=strlen(s);
int lent=strlen(t),len=;
while(len<=lens+lent)len<<=;
memset(A,,sizeof(A));
memset(B,,sizeof(B));
for(int i=;i<lens;i++)
A[i].r=1.0*(s[lens-i-]-'');
for(int i=;i<lent;i++)
B[i].r=1.0*(t[lent-i-]-'');
FFT(A,len,);FFT(B,len,);
for(int i=;i<len;i++)
A[i]=A[i]*B[i];
FFT(A,len,-); memset(ans,,sizeof(ans));
int in=;
for(int i=;i<len;i++){
ans[i]=in+floor(A[i].r+0.5);
in=ans[i]/;
ans[i]%=;
}
int i;
for(i=len;i&&!ans[i];i--);
while(~i)printf("%d",ans[i]),i--;
printf("\n");
}
return ;
}
FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus的更多相关文章
- 快速傅立叶变换&HDU 1402
参考http://www.cnblogs.com/v-July-v/archive/2011/08/13/2214132.html <算导> 那么,更快速的多项式乘法就依赖于能否把一个系数 ...
- FFT快速傅立叶变换的工作原理
实数DFT,复数DFT,FFTFFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换 ...
- spoj VFMUL FFT快速傅立叶变换模板题
题意:求两个数相乘. 第一次写非递归的fft,因为一个数组开小了调了两天TAT. #include<iostream> #include<cstring> #include&l ...
- FFT快速傅立叶变换
//最近突然发现博客园支持\(\rm\LaTeX\),非常高兴啊! 话说离省选只有不到五天了还在学新东西确实有点逗…… 切到正题,FFT还是非常神奇的一个东西,能够反直觉地把两个多项式相乘的时间复杂度 ...
- FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain
您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:
- 离散傅立叶变换与快速傅立叶变换(DFT与FFT)
自从去年下半年接触三维重构以来,听得最多的词就是傅立叶变换,后来了解到这个变换在图像处理里面也是重点中的重点. 本身自己基于高数知识的理解是傅立叶变换是将一个函数变为一堆正余弦函数的和的变换.而图像处 ...
- 快速傅立叶变换(FFT)算法
已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...
- $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换
\(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...
- BZOJ 2194 快速傅立叶变换之二 | FFT
BZOJ 2194 快速傅立叶变换之二 题意 给出两个长为\(n\)的数组\(a\)和\(b\),\(c_k = \sum_{i = k}^{n - 1} a[i] * b[i - k]\). 题解 ...
随机推荐
- Ant学习笔记(2) 在Eclipse中使用Ant
Eclipse默认提供了对Ant的支持,在Eclipse中不需要安装任何插件就能直接编辑和运行Ant.Eclipse中包含了一个Ant脚本编辑器,Ant脚本编辑器提供了对Ant脚本的语法搞来高亮.自动 ...
- Android4.0的Alertdialog对话框,设置点击其他位置不消失
Android4.0以上AlertDialog,包括其他自定义的dialog,在触摸对话框边缘外部,对话框消失. 可以设置这么一条属性,当然必须先AlertDialog.Builder.create( ...
- 前端自动化构建工具 Gulp 使用
一个月没写博客了,今天有时间,就写个gulp的入门使用吧.. 简介:gulp是一个前端自动化构建工具,可以实现代码的检查.压缩.合并……等等,gulp是基于Node.js的自动任务运行器 一.安装No ...
- discuz论坛几种安全策略(二)
大头看了我给的方案,http://www.cnblogs.com/itsmylife/p/4012000.html 今早给的回复如下: “ 补充几点,供参考: 第一条,配置一下允许上传文件的格式以及大 ...
- .net 安装Swagger
官网:http://swagger.io/ 教程:http://www.wmpratt.com/swagger-and-asp-net-web-api-part-1/ 1:安装Dll: https:/ ...
- html input 文本框的一些操作(限制输入...)
1.取消按钮按下时的虚线框 在input里添加属性值 hideFocus 或者 HideFocus=true 2.只读文本框内容 在input里添加属性值 readonly 3.防止退后清空的TEXT ...
- Bridge 模式
Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是 ...
- Win异常: 除了chrome浏览器外,所有安装的软件都连不上网
经查找资料,是LSP被篡改,恢复后使用正常. 百度百科 LSP: Layered Service Provider, 即分层服务提程序,Winsock 作为应用程序的 Windows 的网络套接字工 ...
- CentOS 忘记root密码,解决方法
1.开机后,在倒数5秒结束前,按下任意键 2.在显示centos...的那个界面下,按e键(edit) 3.会出现三行的界面,选择中间 kernel...那行,然后按e键 4.在接着出现的那个界面最后 ...
- 源码来袭!!!基于jquery的ajax分页插件(demo+源码)
前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...