洛谷 P1297 [国家集训队]单选错位(期望)
传送门
解题思路
很妙的一道题。
首先若是选项数都相同,则同等于lc的随机写答案。
所以影响答案的就是前后的选项数。
分情况讨论:
- 若 \(a[i]==a[i+1]\),则 \(ans+=\frac{1}{a[i]}\)
- 若 \(a[i]> a[i+1]\),则选择的选项在 \(a[i+1]\) 中的概率为 \(\frac{a[i+1]}{a[i]}\),再乘上选对的概率 \(\frac{1}{a[i+1]}\),得到 \(ans+=\frac{1}{a[i]}\)
- 若 \(a[i]< a[i+1]\),则下一个题的答案在 \(a[i]\) 中的概率为 \(\frac{a[i]}{a[i+1]}\),再乘上选对的概率 \(\frac{1}{a[i]}\),得到 \(ans+=\frac{1}{a[i+1]}\)
于是总结一下,
\[ans=\sum_{i=1}^{n}\frac{1}{max(a[i],a[i+1])}
\]
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e7+5;
int n,A,B,C,a[maxn];
double e;
int main(){
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;
for(int i=1;i<n;i++) e+=1.0/max(a[i],a[i+1]);
e+=1.0/max(a[n],a[1]);
printf("%0.3lf",e);
return 0;
}