给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.
第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
n行,第i行输出Ei。
与标准答案误差不超过1e-2即可。
输入 #1
5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880
输出 #1
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872
对于30%的数据,n≤1000。
对于50%的数据,n≤60000。
对于100%的数据,n≤100000,0
------------------------------------------分割线---------------------------------------------------------------------------------
RT
卡精度,1.0/(i*i)要写成1.0/i/i
------------------------------------------分割线---------------------------------------------------------------------------------
#include
using namespace std;
const double PI = acos(-1.0);
const int N=1e5+5;
struct Complex
{
double x,y;
Complex(double _x = 0.0,double _y = 0.0)
{
x=_x;
y=_y;
}
Complex operator - (const Complex &b)const
{
return Complex(x-b.x,y-b.y);
}
Complex operator + (const Complex &b)const
{
return Complex(x+b.x,y+b.y);
}
Complex operator * (const Complex &b)const
{
return Complex(x*b.x-y*b.y,x*b.y+y*b.x);
}
};
void change(Complex y[],int len)
{
int i,j,k;
for(i=1,j=len/2; i<len-1; i++)
{
if(i<j)
swap(y[i],y[j]);
k=len/2;
while(j>=k)
{
j-=k;
k/=2;
}
if(j<k)
j+=k;
}
}
void FFT(Complex y[],int len)
{
change(y,len);
for(int h=2; h<=len; h<<=1)
{
Complex wn(cos(-2*PI/h),sin(-2*PI/h));
for(int j=0; j<len; j+=h)
{
Complex w(1,0);
for(int k=j; k<j+h/2; k++)
{
Complex u=y[k];
Complex t=w*y[k+h/2];
y[k]=u+t;
y[k+h/2]=u-t;
w=w*wn;
}
}
}
}
void IFFT(Complex y[],int len)
{
change(y,len);
for(int h=2; h<=len; h<<=1)
{
Complex wn(cos(2*PI/h),sin(2*PI/h));
for(int j=0; j<len; j+=h)
{
Complex w(1,0);
for(int k=j; k<j+h/2; k++)
{
Complex u=y[k];
Complex t=w*y[k+h/2];
y[k]=u+t;
y[k+h/2]=u-t;
w=w*wn;
}
}
}
for(int i=0; i<len; i++)
y[i].x/=len;
}
Complex x1[4*N],x2[4*N],x3[4*N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf",&x1[i].x);
x2[n-i+1].x=x1[i].x;
}
for(int i=1;i<=n;i++)
{
x3[i]=(1.0/(double)(i))/(double)(i);
}
int len=1;
while(len<=2*n)
{
len<<=1;
}
FFT(x1,len);
FFT(x2,len);
FFT(x3,len);
for(int i=1;i<=len;i++)
{
x1[i]=x1[i]*x3[i];
x2[i]=x2[i]*x3[i];
}
IFFT(x1,len);
IFFT(x2,len);
for(int i=1;i<=n;i++)
{
printf("%lf\n",x1[i].x-x2[n-i+1].x);
}
return 0;
}