BZOJ 3527 [Zjoi2014] 力

来源:互联网 发布:java replace的原理 编辑:程序博客网 时间:2024/06/06 13:22

Description

给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.

Input

第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
n≤100000,0<qi<1000000000

Output

 n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

Sample Input

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872

HINT

Source

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

FFT~

变量名要有区分度!!!


#include<cstdio>#include<complex>#include<cmath>using namespace std;#define E complex<double>#define pi acos(-1)#define N 262144int n,m,l,r[N];double x;E a[N],b[N],g[N],f1[N],f2[N];void fft(E *u,int v){for(int i=0;i<n;i++) if(i>r[i]) swap(u[i],u[r[i]]);for(int i=1;i<n;i<<=1){E wn(cos(pi/i),v*sin(pi/i));for(int j=0;j<n;j+=(i<<1)){E w(1,0);for(int k=0;k<i;k++,w*=wn){E x=u[j+k],y=u[i+j+k]*w;u[j+k]=x+y;u[i+j+k]=x-y;}}}if(v==-1) for(int i=0;i<n;i++) u[i]/=n;}int main(){scanf("%d",&n);n--;m=n*2;for(int i=0;i<=n;i++) scanf("%lf",&x),a[i]=b[n-i]=x;for(int i=1;i<=n;i++) g[i]=(1.0/i/i);for(n=1;n<=m;n<<=1) l++;for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));fft(a,1);fft(b,1);fft(g,1);for(int i=0;i<n;i++) f1[i]=g[i]*a[i];for(int i=0;i<n;i++) f2[i]=g[i]*b[i];fft(f1,-1);fft(f2,-1);n=m/2;for(int i=0;i<=n;i++) printf("%.3lf\n",f1[i].real()-f2[n-i].real());return 0;}


1 0
原创粉丝点击