您的位置:首页 > 其它

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]);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: