题解:
单独考虑每一道题目对答案的贡献。
设$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; }