这是这套题中最水的一题,考场我的做法是用一个期望概率dp,计算出砍100000次刀之后的值,然后可以发现:
从10000增长到100000,从100000到1000000,增长的数每次是上一次的10^-1倍,然后就可以用等比数列求和做出来。
正解是设每砍i刀暴击一次的期望是s[i],则有s[i]=(1-x)*(1-2*x)*...*(1-(i-1)*x)*(k*x)*i;
那么最后的答案就是1/(sigma(s[i]))
#include<cstdio> #include<algorithm> #include<cstring> #define db double #define N 2000000 using namespace std; int n,x,i,k; db sum[N],ans; int main(){ freopen("lol.in","r",stdin); freopen("lol.out","w",stdout); scanf("%d",&x); k=100/x; if (100%x==0) k--; sum[0]=1; for (i=1;i<=k;i++) sum[i]=(db)sum[i-1]*(1-(db)x*i/100); ans=0; for (i=1;i<=k+1;i++) ans+=(db)sum[i-1]*((db)min(x*i,100)/100)*i; printf("%.10lf ",1/ans); return 0; }