Description
请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。
Input
第一行一个整数N,接下来N行,第i+2..i+N-1行,每行两个数,依次表示a[i],b[i] (0 < = i < N)。
Output
输出N行,每行一个整数,第i行输出C[i-1]。
Sample Input
5
3 1
2 4
1 1
2 4
1 4
3 1
2 4
1 1
2 4
1 4
Sample Output
24
12
10
6
12
10
6
1
FFT直接做。。可我还不是太能理解FFT。。
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
double pi=acos(-1.0); // PI值
struct complex
{
double r,i;
complex(double real=0.0,double image=0.0)
{
r=real;
i=image;
}
// 以下为三种虚数运算的定义
complex operator +(complex o) const
{
return complex(r+o.r,i+o.i);
}
complex operator -(complex o) const
{
return complex(r-o.r,i-o.i);
}
complex operator *(complex o) const
{
return complex(r*o.r-i*o.i,r*o.i+i*o.r);
}
};
complex a[1000001],b[1000001];
int x1[1000001],x2[1000001];
bool v[1000001];
int sum[1000001];
inline void brc(complex *a,int l) //二进制反转
{
memset(v,false,sizeof(v));
int i;
for(i=1;i<l-1;i++)
{
int x=i,y=0;
int m=(int)log2(l)+0.1;
if(v[x])
continue;
while(m!=0)
{
m--;
y=y*2;
y=(y|(x&1));
x=x/2;
/*y<<=1;
y|=(x&1);
x>>=1;*/
}
v[i]=true;
v[y]=true;
swap(a[i],a[y]);
}
}
inline void fft(complex *y,int l,double on)
{
int i,j,k;
complex u,t;
brc(y,l);//二进制反转
for(i=2;i<=l;i=i*2)
{
complex wn(cos(on*2*pi/i),sin(on*2*pi/i));
for(j=0;j<l;j+=i)
{
complex w(1,0);
for(k=j;k<j+i/2;k++)
{
u=y[k];
t=w*y[k+i/2];
y[k]=u+t;
y[k+i/2]=u-t;
w=w*wn;
}//蝴蝶操作
}
}
if(on==-1)
{
for(i=0;i<l;i++)
y[i].r/=l;//IDFT
}
}
int main()
{
int n;
scanf("%d",&n);
int la=n,lb=n;
int l=1;
while(l<la*2||l<lb*2)
l=l*2;
int i;
for(i=0;i<=n-1;i++)
scanf("%d%d",&x1[i],&x2[n-i-1]);
for(i=0;i<la;i++) // 倒置存入
{
a[i].r=x1[la-i-1];
a[i].i=0.0;
}
for(i=la;i<l;i++)
{
a[i].r=0.0;
a[i].i=0.0;
}
for(i=0;i<lb;i++)
{
b[i].r=x2[lb-i-1];
b[i].i=0.0;
}
for(i=lb;i<l;i++)
{
b[i].r=0.0;
b[i].i=0.0;
}
fft(a,l,1);//DFT
fft(b,l,1);//DFT
for(i=0;i<l;i++)
a[i]=a[i]*b[i];
fft(a,l,-1);//IDFT
for(i=0;i<l;i++)
sum[i]=a[i].r+0.5;
/* for(i=0;i<l;i++)
{
sum[i+1]+=sum[i]/10;
sum[i]%=10;
}*/
l=la+lb-1;
while(sum[l]==0)
l--;
for(i=n-1;i>=0;i--)
printf("%d\n",sum[i]);
//printf("\n");
// }
return 0;
}