分块乱搞
注意:double*int和int开根号会掉精度,要在结果后面加上一个极小的数(1e-10)来防止掉精度
/**************************************************************
Problem: 1011
User: syh0313
Language: C++
Result: Accepted
Time:2936 ms
Memory:3644 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using
namespace
std;
const
int
maxn=100010;
int
n;
double
m[maxn],ans[maxn],A,sum[maxn],t;
int
main()
{
scanf
(
"%d%lf"
,&n,&A);
for
(
int
i=1;i<=n;i++)
scanf
(
"%lf"
,&m[i]),sum[i]=sum[i-1]+m[i];
for
(
int
j=1;j<=n;j++)
{
int
k=A*j+1e-10;
if
(k==0)
continue
;
if
(k<=1000)
{
for
(
int
i=1;i<=k;i++) ans[j]+=m[i]*m[j]/(j-i);}
else
{
t=
pow
(n,0.38)+1e-10;
int
M=k/t;
for
(
int
i=0;i*M<k;i++)
{
int
st=i*M+1,ed=min((i+1)*M,k);
ans[j]+=(sum[ed]-sum[st-1])*m[j]/(j-(st+ed)/2);
}
}
}
for
(
int
i=1;i<=n;i++)
printf
(
"%.6lf\n"
,ans[i]);
return
0;
}