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]\). 题解 ...
随机推荐
- C#,MVC视图中把枚举转成DropdownList
1.拓展EnumHelper public static class EnumHelper { // Get the value of the description attribute if the ...
- linux进程地址空间详解(转载)
linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...
- 学习java随笔第二篇:java开发工具——Eclipse
java开发工具有很多这里我使用的是Eclipse. 首先我在官网上下载了Eclipse的软件包,下载地址:http://www.eclipse.org/downloads/,然后有在网上找了一个汉化 ...
- 系统重装c盘后,mysql重新设置
之前我的mysql装在d盘,重装了系统后,虽然只格式化了c盘,但mysql还是不能用了.我网上找了找.修改了一下配置. 1.首先设置环境变量,编辑path,在后面添加上mysql的安装路径 : 2.之 ...
- 【原】ios tableViewCell 自适应高度
原文:http://www.cnblogs.com/A--G/p/4819051.html 前言:之前在做一个类似微博的小需求时候,用table view实现了微博文字和图片等等的基本展示,由于文字和 ...
- 用html/css做的一个登入小界面(图片瀑布流)
一个登入效果简易图:(色彩搭配有点乱,嘻嘻,可以在代码处改成自己喜欢的颜色) css样式的代码: style.css: @charset "utf-8";/* CSS Docume ...
- 掌握JS
1.原生的js,好比全真教的武功,一步步从基础开始(先练气再御剑),很长一段时间内和jquery有很大差距,掌握以后发现jquery只不过是另外一种武功,看一遍既会.且当学原生到一定程度之后,可以自创 ...
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
1.简单的小例子: 下面这个例子主要观察的是: 一个对象的wait()和notify()使用情况! 当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对 ...
- 2016.7.13abstract
abstract的使用: 1.当许多类中有相同的功能,功能的内容不同,那么我们向上提取功能的定义. 2当功能的定义被 abstract修饰后,那么它的类也要被abstract修饰,使其抽象化. 3被a ...
- servlet从xml提取数据登陆
在xml文档下可以设置参数的初始值,在这里把他当成了数据库在用 <servlet> <description>This is the description of my J2E ...