[BZOJ 1011][HNOI2008]遥远的行星(奇技淫巧)

Description

直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=
Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力
,只要结果的相对误差不超过5%即可

Solution

只要结果的相对误差不超过5%即可

只要结果的相对误差不超过5%即可

只要结果的相对误差不超过5%即可

当计算行星i的受力时,如果i超过一定值,a*i相对i来说就很小了,可以把分母取平均值,用前缀和计算

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define eps 1e-9
using namespace std;
int n;
long long m[100005],sum[100005];
double a;
int main()
{
    scanf("%d%lf",&n,&a);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&m[i]);
        sum[i]=m[i]+sum[i-1]; 
    }
    for(int i=1;i<=n;i++)
    {
        double x=0;
        int hah=a*i+eps; 
        if(i<=1000)
        for(int j=1;j<=hah;j++)
        x+=(m[j]*m[i])/(double)(i-j);
        else
        {x=(sum[hah]*m[i])/(i-hah*0.5);}
        printf("%lf\n",x);
    }
    return 0;
}

 

posted @ 2017-03-31 18:47  Zars19  阅读(143)  评论(0编辑  收藏  举报