充满玄学的一道题。
首先,O(n^2)的算法很简单对吧,但如何不T呢。
“样例输出的结果误差不超过5%”,这就很有趣了,我们不需要得到很精确的值,我们就近似一下吧。
#include<bits/stdc++.h>
#define N 100000
#define eps 1e-8
using namespace std;
int n,M[N+1],T;
double A,ans,sum[N+1];
inline int read()
{
char c=getchar();
int x=0,b=1;
for(;!(c<='9'&&c>='0');c=getchar())if(c=='-')b=-1;
for(;c<='9'&&c>='0';c=getchar())x=x*10+c-'0';
return x*b;
}
int main()
{
//freopen("in.txt","r",stdin);
n=read();scanf("%lf",&A);
for(int i=1;i<=n;i++)M[i]=read();
for(int i=1;i<=n;i++)sum[i]=sum[i-1]+M[i];
T=min(100,n);
for(int i=1;i<=T;i++)
{
ans=0.0;
for(int j=1;j<=int((double)i*A+eps);j++)
ans+=(double)M[i]*M[j]/(double)(i-j);
printf("%.6f\n",ans);
}
for(int i=T+1;i<=n;i++)
{
ans=0.0;
int j=int((double)i*A+eps);
ans=M[i]*sum[j]/(double)(i-j/2);
printf("%.6f\n",ans);
}
return 0;
}
ps:eps也真是玄学啊,虽然不知道原理233