spoj VFMUL FFT快速傅立叶变换模板题
题意;求两个数相乘。
第一次写非递归的fft,因为一个数组开小了调了两天TAT。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
#define PI 3.1415926535897932384
#define MAXN 1200000
#pragma optimize("O2")
struct Complex
{
double x,y;
Complex(){};
Complex(double x,double y):x(x),y(y){};
void init(double x,double y)
{
this->x=x;this->y=y;
}
Complex operator +(Complex a)
{
Complex ret(x + a.x, y + a.y);
return ret;
}
Complex operator -(Complex a)
{
Complex ret(x - a.x, y - a.y);
return ret;
}
Complex operator *(Complex a)
{
Complex ret(x*a.x - y*a.y, x*a.y + y*a.x);
return ret;
}
Complex operator /(double v)
{
Complex ret(x/v,y/v);
return ret;
}
Complex operator =(double x)
{
this->x=x;
return *this;
}
void operator -=(Complex a)
{
this->x-=a.x;
this->y-=a.y;
}
void operator +=(Complex a)
{
this->x+=a.x;
this->y+=a.y;
}
};
char ss[MAXN];
int t1[MAXN],t2[MAXN];
int pp[MAXN];
Complex ww[MAXN][];
Complex g1[MAXN],g2[MAXN];
long long res[MAXN];
int n;
void dft(Complex g[],int len,int sign)
{
Complex t;
for (int i=;i<len;i<<=)
{
for (int j=;j<len;j+=(i<<))
{
for (int k=;k<i;k++)
{
t=g[j+k];
g[j+k]=g[j+k]+g[j+k+i]*ww[k*((n>>)/i)][sign];
g[j+k+i]=t-g[j+k+i]*ww[k*((n>>)/i)][sign];
}
}
}
} int main()
{
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int i,j,k,x,y,z,m;
int n1,n2;
int nn;
scanf("%d",&nn);
while (nn--)
{ scanf("%s",ss);
m=strlen(ss);
for (i=;i<m;i++)
t1[(m-i-)/]=t1[(m-i-)/]*+ss[i]-'';
n1=(m-)/+;
scanf("%s",ss);
m=strlen(ss);
for (i=;i<m;i++)
t2[(m-i-)/]=t2[(m-i-)/]*+ss[i]-'';
n2=(m-)/+;
n=max(n1,n2);
while (n!=(n&(-n)))n-=n&(-n);
n<<=;
for (i=;i<n;i++)
for (j=n>>,x=;j;j>>=,x<<=)
if (i&j)pp[i]+=x;
for (i=;i<n1;i++)g1[pp[i]].x=t1[i];
for (i=;i<n2;i++)g2[pp[i]].x=t2[i];
for (i=;i<=n;i++)
{
ww[i][].init(cos(*PI*i/n), -sin(*PI*i/n));
ww[i][].x=ww[i][].x;
ww[i][].y=-ww[i][].y;
}
dft(g1,n,);
dft(g2,n,);
for (i=;i<n;i++)g2[i]=g1[i]*g2[i];
for (i=;i<n;i++)g1[pp[i]]=g2[i];
dft(g1,n,);
for (i=;i<n;i++)res[i]=(long long)(g1[i].x/n+0.5);
for (i=;i<n;i++)res[i+]+=res[i]/,res[i]%=;
m=n;
while (m && !res[m-])m--;
printf("%d",(int)res[m-]);
for (i=m-;i>=;i--)
printf("%05d",(int)res[i]);
printf("\n");
memset(t1,,sizeof(t1[])*n);
memset(t2,,sizeof(t2[])*n);
memset(pp,,sizeof(pp[])*n);
memset(res,,sizeof(res[])*n);
memset(g1,,sizeof(g1[])*n);
memset(g2,,sizeof(g2[])*n);
}
}
spoj VFMUL FFT快速傅立叶变换模板题的更多相关文章
- FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: th ...
- FFT快速傅立叶变换的工作原理
实数DFT,复数DFT,FFTFFT是计算DFT的快速算法,但是它是基于复数的,所以计算实数DFT的时候需要将其转换为复数的格式,下图展示了实数DFT和虚数DFT的情况,实数DFT将时域中N点信号转换 ...
- FFT快速傅立叶变换
//最近突然发现博客园支持\(\rm\LaTeX\),非常高兴啊! 话说离省选只有不到五天了还在学新东西确实有点逗…… 切到正题,FFT还是非常神奇的一个东西,能够反直觉地把两个多项式相乘的时间复杂度 ...
- FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain
您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:
- 【bzoj2179】FFT快速傅立叶 FFT模板
2016-06-01 09:34:54 很久很久很久以前写的了... 今天又比较了一下效率,貌似手写复数要快很多. 贴一下模板: #include<iostream> #include& ...
- 离散傅立叶变换与快速傅立叶变换(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]\). 题解 ...
随机推荐
- Socket解决粘包问题1
粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘 ...
- PPPoE Server Under Ubuntu/Debian
http://imranasghar.blogspot.com/2009/05/pppoe-server-under-ubuntudebian.html ----------------------- ...
- MAC终端显示隐藏文件,关闭显示
1.显示隐藏文件夹显示:defaults write com.apple.finder AppleShowAllFiles -bool true (1)复制“defaults write com.ap ...
- 破解C#的readonly只读字段
破解C#的readonly只读字段 目录 请允许我再唠叨几句const和readonly 修改readonly字段: 计策1:反间计 -- 反射修改 计策2:借刀杀人--调节字段偏移位置的结构体来修改 ...
- Form开发中组件控制的几个常用方法
转自:http://oracleseeker.com/2009/09/01/graphical_component_control_in_oracle_ebs_form/ 在Oracle EBS 的F ...
- PAT L1-009. N个数求和
本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数“分子/分母”的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(<=100).随后一行按格 ...
- 关于block块使用的6点注意事项
对于刚学习OC新伙伴,block块一直都是一个比较纠结.比较难懂的知识点,不过,在使用一段时间后,就会感觉很酸爽.block块的原理及使用我就不再赘述,网上有很多这方面的资料.我个人使用这么长时间以来 ...
- 【转】iOS开发——基本常识篇&各种控件默认高度
原文:http://www.cnblogs.com/iCocos/p/4595614.html 各种控件默认高度 1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注 ...
- caffe源码阅读(3)-Datalayer
DataLayer是把数据从文件导入到网络的层,从网络定义prototxt文件可以看一下数据层定义 layer { name: "data" type: "Data&qu ...
- starling 中的 EventDispatcher 和 Flash中原生的 EventDispatcher
starling 比较早之前就有开始解了,但只到最近参与一个用starling 做为框架的手游项目才真正做为一程来使用它. 项目也是刚开始搭建,在这做些笔记. 在写一个管理类时, 遇到 starlin ...