单选错位
题目链接:ybt高效进阶6-6-1 / luogu P1297
题目大意
有 n 个单选题,每道题有一定的选项,然后每道题的答案是在每个选项中等概率随机一个。
然后你问你如果你的答案都是对的,但是你都填到了下一题的位置(如果是最后一题就填到第一题),你能对的题的期望个数。
思路
首先不难想到要能对就是要相邻两个选项是选的一样。
那我们可以对于每一个相邻的算它能对的概率,然后加在一起就是答案了。
那如果两个选项的个数分别是
x
,
y
x,y
x,y 个,那你少的那个任选,多的那个选到少的选的那个就可以了。
所以是
1
max
(
x
,
y
)
\dfrac{1}{\max(x,y)}
max(x,y)1。
然后就好啦。
代码
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
int n, A, B, C, a[10000001];
double ans;
int main() {
scanf("%d %d %d %d %d", &n, &A, &B, &C, a + 1);
for (int i = 2; i <= n; i++)
a[i] = ((ll) 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++) {
int to = i + 1;
if (to > n) to = 1;
ans += 1.0 / max(a[i], a[to]);
}
printf("%.3lf", ans);
return 0;
}