P1297 [国家集训队]单选错位(期望)

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