[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; }