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

题目链接

题解:

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

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

我们要求的就是$sum_{i=1}^{n} P(g_i=1) imes 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}$时,则有$1leqslant s_{i-1},s_ileqslant min(a_{i-1},a_i)$。

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

设$X=a_1 imes a_2 imes a_3 imes ... imes 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;
} 
原文地址:https://www.cnblogs.com/wozaixuexi/p/9477513.html