2017.8.24 快速傅里叶 思考记录
2017-08-24 22:06
155 查看
注意一下比较重要的:
逆序的操作:它的上一位置的值去掉一位,在加上它本身向左缩进的一部分
对位的操作,注意是<n 因为方便操作,从0处理
注意交换a的值
注意奇项要乘w
码:
#include<iostream>
#include<complex>
#include<cstring>
#include<cstdio>
#include<cmath>
#define pi acos(-1)
#define N 200000
using namespace std;
typedef complex<double>E;
E a
,b
;
int n,m,c
,r
;
char ch[200005];
void fft(E *a,int f)
{
int i,j,k;
for(i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
for(i=1;i<n;i<<=1)
{E wn(cos(pi/i),f*sin(pi/i));
for(j=0;j<n;j+=(i<<1))
{
E w(1,0);
for(k=0;k<i;k++,w*=wn)
{
E x=a[k+j],y=a[k+j+i]*w;
a[k+j]=x+y,a[k+j+i]=x-y;
}
}
}
if(f==-1)for(i=0;i<n;i++)a[i]/=n;
}
int main()
{
int i,j,l=0;
scanf("%d",&n);n--;
scanf("%s",ch);
for(i=0;i<=n;i++)a[i]=ch[n-i]-'0';
scanf("%s",ch);
for(i=0;i<=n;i++)b[i]=ch[n-i]-'0';
m=2*n;
for(n=1;n<=m;n<<=1)l++;
for(i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
fft(a,1);fft(b,1);
for(i=0;i<=n;i++)a[i]=a[i]*b[i];
fft(a,-1);
for(i=0;i<=m;i++)c[i]=(int)(a[i].real()+0.1);
for(i=0;i<=m;i++)
if(c[i]>=10)//进位
{
c[i+1]+=c[i]/10,c[i]%=10;
if(i==m)m++;
}
for(i=m;i>=0;i--)printf("%d",c[i]);
}
逆序的操作:它的上一位置的值去掉一位,在加上它本身向左缩进的一部分
对位的操作,注意是<n 因为方便操作,从0处理
注意交换a的值
注意奇项要乘w
码:
#include<iostream>
#include<complex>
#include<cstring>
#include<cstdio>
#include<cmath>
#define pi acos(-1)
#define N 200000
using namespace std;
typedef complex<double>E;
E a
,b
;
int n,m,c
,r
;
char ch[200005];
void fft(E *a,int f)
{
int i,j,k;
for(i=0;i<n;i++)if(i<r[i])swap(a[i],a[r[i]]);
for(i=1;i<n;i<<=1)
{E wn(cos(pi/i),f*sin(pi/i));
for(j=0;j<n;j+=(i<<1))
{
E w(1,0);
for(k=0;k<i;k++,w*=wn)
{
E x=a[k+j],y=a[k+j+i]*w;
a[k+j]=x+y,a[k+j+i]=x-y;
}
}
}
if(f==-1)for(i=0;i<n;i++)a[i]/=n;
}
int main()
{
int i,j,l=0;
scanf("%d",&n);n--;
scanf("%s",ch);
for(i=0;i<=n;i++)a[i]=ch[n-i]-'0';
scanf("%s",ch);
for(i=0;i<=n;i++)b[i]=ch[n-i]-'0';
m=2*n;
for(n=1;n<=m;n<<=1)l++;
for(i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
fft(a,1);fft(b,1);
for(i=0;i<=n;i++)a[i]=a[i]*b[i];
fft(a,-1);
for(i=0;i<=m;i++)c[i]=(int)(a[i].real()+0.1);
for(i=0;i<=m;i++)
if(c[i]>=10)//进位
{
c[i+1]+=c[i]/10,c[i]%=10;
if(i==m)m++;
}
for(i=m;i>=0;i--)printf("%d",c[i]);
}
相关文章推荐
- 快速傅里叶(FFT)的快速深度思考
- 高效快速删除Oracle表中重复记录
- 如何对EXCEL一列的数据中快速提取不重复的记录
- 【连载】高效人士的116个IT秘诀(第2版)——秘诀25快速记录你的工作日志
- oracle-快速删除重复的记录
- oracle-快速删除重复的记录
- 2017.9.17 相关分析 思考记录
- oracle快速向表中插入记录方法
- MSSQLSERVER中如何快速获取表的记录总数
- 在SQL Server中快速删除重复记录
- 快速删除重复记录
- MS SQLSERVER中如何快速获取表的记录总数
- MSSql技巧之快速得到表的记录总数
- 2017.8.8 魔兽地图DotR 思考记录
- U8快速实施工具导入提示“该修改的记录可能被删除”
- 2017.9.23 Count on a tree 思考记录
- 在SQL Server中快速删除重复记录(多图)
- 2017.9.25 社交网络 思考记录
- 2017.9.28 降雨量 思考记录
- 数据记录快速查找算法