题目大意:
题目链接:https://www.luogu.org/problemnew/show/P1297
有
n
n
n道单选题,第
i
i
i道题有
a
i
a_i
ai个选项,在
1
∼
a
i
1\sim a_i
1∼ai中随机选择一个选项写到第
i
+
1
i+1
i+1题的答案上。其中第
n
n
n题写道第一题的答案上。求做对题数的期望。
思路:
分类讨论一下。
- 当 a i = a i + 1 a_i=a_{i+1} ai=ai+1,那么显然随机的答案在第 i + 1 i+1 i+1题也是随机的。期望为 1 a i \frac{1}{a_i} ai1,也就是 1 a i + 1 \frac{1}{a_{i+1}} ai+11
- 当 a i > a i + 1 a_i>a_{i+1} ai>ai+1,只有 a i + 1 a i \frac{a_{i+1}}{a_i} aiai+1的概率答案在 1 ∼ a i + 1 1\sim a_{i+1} 1∼ai+1中。所以期望为 a i + 1 a i × 1 a i + 1 = 1 a i \frac{a_{i+1}}{a_i}\times \frac{1}{a_{i+1}}=\frac{1}{a_i} aiai+1×ai+11=ai1
- 当 a i < a i + 1 a_i<a_{i+1} ai<ai+1,由于随机的答案只在 1 ∼ a i 1\sim a_i 1∼ai中,而第 i + 1 i+1 i+1题正确答案有 a i a i + 1 \frac{a_i}{a_{i+1}} ai+1ai的概率在 1 ∼ a i 1\sim a_i 1∼ai中,所以期望为 a i a i + 1 × 1 a i = 1 a i + 1 \frac{a_i}{a_{i+1}}\times \frac{1}{a_i}=\frac{1}{a_{i+1}} ai+1ai×ai1=ai+11
综上,答案就是 ∑ i = 1 n 1 m a x ( a i , a i + 1 ) \sum^{n}_{i=1}\frac{1}{max(a_i,a_{i+1})} ∑i=1nmax(ai,ai+1)1
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int N=10000010;
int n,a[N];
double ans;
void init() //题目给出的生成数据的方法
{
int A,B,C;
scanf("%d%d%d%d%d",&n,&A,&B,&C,a+1);
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;
}
int main()
{
init();
a[n+1]=a[1];
/*printf("a数组如下:\n");
for (int i=1;i<=n;i++)
printf("%d ",a[i]);printf("\n\n");*/
for (int i=1;i<=n;i++)
ans+=1/(double)max(a[i],a[i+1]);
printf("%0.3lf",ans);
return 0;
}