这真是一道坑爹的题目啊,虽然我猜到怎么做了,但是还是不会搞。
设f[i]表示第i个行星所受的引力,g[i]表示第i个行星所受引力的最后来源行星。
则:
注意到题目中说了误差允许在百分之五之内,所以我们考虑f[i+t]与f[i]的关系。
由于:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
#define maxn 110000
#define eps 1e-8
double f[maxn];
double m[maxn],sum[maxn];
double a;
int n;
void init()
{
scanf("%d%lf",&n,&a);
for(int i=1;i<=n;i++)
{
scanf("%lf",&m[i]);
sum[i]=sum[i-1]+m[i];
}
}
void solve()
{
for(int i=min(1500,n);i;i--)
{
int k=(int)(a*i);
if(fabs((double)(k+1)/a-i)<eps) k++;
for(int j=1;j<=k;j++)
f[i]=f[i]+m[i]*m[j]/(double)(i-j);
}
for(int i=1501;i<=n;i++)
{
int k=(int)(a*i),mid=(1+k)>>1;
f[i]=sum[k]*m[i]/(double)(i-mid);
}
}
int main()
{
init();
solve();
for(int i=1;i<=n;i++)
printf("%lf\n",f[i]);
return 0;
}