3527: [Zjoi2014]力
Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2126 Solved: 1261
[ Submit][ Status][ Discuss]
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
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880
Sample Output
-16838672.693
3439.793
7509018.566
4595686.886
10903040.872
3439.793
7509018.566
4595686.886
10903040.872
【分析】
http://blog.youkuaiyun.com/wzq_qwq/article/details/48155921
看了题解自己码了一发...精度爆炸
b[i].r=(-1.0)/((double)(n-i)*(double)(n-i));
一定要注意所有变量都变成double型的...(被这东西卡了一晚上)
【代码】
//bzoj 3527 [Zjoi2014]力
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int mxn=800005;
int n,m,L,N,M;
int R[mxn],ans[mxn];
struct E
{
double r,f;
E (double u,double v) {r=u,f=v;}
E () {}
E operator + (E u) {return E(r+u.r,f+u.f);}
E operator - (E u) {return E(r-u.r,f-u.f);}
E operator * (E u) {return E(r*u.r-f*u.f,r*u.f+f*u.r);}
E operator / (int v) {return E(r/v,f/v);}
}a[mxn],b[mxn],c[mxn];
inline void fft(E *a,int f)
{
fo(i,0,n-1) if(i<R[i]) swap(a[i],a[R[i]]);
for(int i=1;i<n;i<<=1)
{
E wn(cos(pi/i),f*sin(pi/i));
for(int j=0;j<n;j+=(i<<1))
{
E w(1,0);
for(int k=0;k<i;k++,w=w*wn)
{
E x=a[j+k],y=w*a[j+k+i];
a[j+k]=x+y,a[j+k+i]=x-y;
}
}
}
if(f==-1) fo(i,0,n-1) a[i].r=a[i].r/n;
}
int main()
{
scanf("%d",&n);n--;
fo(i,0,n)
scanf("%lf",&a[i].r);
fo(i,0,n-1)
b[i].r=(-1.0)/((double)(n-i)*(double)(n-i));
fo(i,n+1,n+n)
b[i].r=-b[n+n-i].r;
M=4*n;for(n=1;n<M;n<<=1) L++;M/=4;
fo(i,0,n-1) R[i]=(R[i>>1]>>1)|((i&1)<<L-1);
fft(a,1),fft(b,1);
fo(i,0,n) c[i]=a[i]*b[i];
fft(c,-1);
fo(i,M,M+M) printf("%.3lf\n",c[i].r);
return 0;
}