P1297 [国家集训队]单选错位(期望)
期望入门
我们考虑涂到第$i$道题时的情况
此时题$i$答案有$a[i]$种,我们可能涂$a[i+1]$种
分类讨论:
1.$a[i]>=a[i+1]$:
可能涂到答案的概率为$(a[i+1]/a[i])*(1/a[i+1])=1/a[i]$,贡献为1
没涂到的概率为$1-1/a[i]$,贡献为0
期望值:$1*(1/a[i])+0*(1-1/a[i])=1/a[i]$
2.$a[i]<a[i+1]$:
可能涂到答案的概率为$(a[i]/a[i+1])*(1/a[i])=1/a[i+1]$,贡献为1
没涂到的概率为$1-1/a[i+1]$,贡献为0
期望值:$1*(1/a[i+1])+0*(1-1/a[i+1])=1/a[i+1]$
总结一下,每次的期望值就是$1/max(a[i],a[i+1])$
最后把每次的期望值累加起来就好辣
#include<cstdio> #define N 10000005 inline int Max(int a,int b){return a>b?a:b;} int a[N],n,A,B,C; double f; int main(){ scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1); for (register int i=2;i<=n;i++) a[i] = ((long long)a[i-1] * A + B) % 100000001; for (register int i=1;i<=n;i++) a[i] = a[i] % C + 1; for(register int i=1;i<n;++i) f+=1/(double)Max(a[i],a[i+1]); f+=1/(double)Max(a[n],a[1]); printf("%.3lf",f); return 0; }