Luogu P1297 [国家集训队]单选错位 | 概率与期望

题目链接

 

题解:

单独考虑每一道题目对答案的贡献。

设$g_i$表示gx在第$i$道题目的答案是否正确(1表示正确,0表示不正确),则$P(g_i=1)$表示gx在第$i$道题目的答案正确的概率。

我们要求的就是$\sum_{i=1}^{n} P(g_i=1)\times 1$。

那么我们该如何求解$P(g_i=1)$呢?

首先,结合题目可以得出以下结论:

设$s_i$为第i道题目的正确答案。

若$g_i=1$,则有$s_i=s_{i-1}$。特别地,若$g_1=1$,则有$s_n=s_1$。

反之亦然。

(为了方便,以下文字先不考虑$i=1$的情况。)

那么,对于每一个$s_i$,当$s_i=s_{i-1}$时,则有$1\leqslant s_{i-1},s_i\leqslant min(a_{i-1},a_i)$。

在$s_i=s_{i-1}$的情况下,

设$X=a_1\times a_2\times a_3\times ...\times a_n,k=s_{i-1}=s_i$,那么对于每一个$k$,都会有$\dfrac{X}{a_{i-1}a_i}$种可能的情况使$s_{i-1}=s_i=k$。

因为$k$一共能取$min(a_{i-1},a_i)$个数,所以$s_{i-1}=s_i$的总情况数即为$min(a_{i-1},a_i)\dfrac{X}{a_{i-1}a_i}$。

又因为所有的情况一共有$X$种,所以$P(g_i=1)=\dfrac{min(a_{i-1},a_i)\dfrac{X}{a_{i-1}a_i}}{X}$。

整理可得$P(g_i=1)=\dfrac{1}{max(a_{i-1},a_i)}$。

最后的答案即为$\sum_{i=2}^{n} \dfrac{1}{max(a_{i-1},a_i)}+\dfrac{1}{max(a_n,a_1)}$。

循环统计即可。

 

代码:

#include<iostream>
#include<cstdio>
    using namespace std;
    int a[10000005];
int main()
{
    int n=0,A=0,B=0,C=0;
    scanf("%d%d%d%d%d",&n,&A,&B,&C,&a[1]);
    //按照题目所给的方式计算a[i] 
    for(int i=2;i<=n;i++) a[i]=((long long)a[i-1]*A+B)%100000001;
    for(int i=1;i<=n;i++) a[i]=a[i]%C+1;
    double ans=0;
    for(int i=1;i<=n;i++)//循环统计 
        if(i==1) ans+=1/(double)max(a[n],a[i]);//注意当i=1时要特判! 
            else ans+=1/(double)max(a[i-1],a[i]);
    printf("%.3f",ans);
    return 0;
} 

 

posted @ 2018-08-14 21:17  wozaixuexi  阅读(198)  评论(0编辑  收藏  举报