BZOJ2134 单选错位

题目地址

题解

考虑每一道题对答案的贡献。容易发现当一道题的选项数目是$a$,而错填到这道题的答案所属的原来那道题目有$b$个选项时,这道题目对的概率是$\frac{1}{\max\left{a, b\right}}$(可以画格子图,看对角线来考虑)。然后这道题对的期望就是概率$\times 1$。
所以对每一个题目都这么跑一遍就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
int n, A, B, C, a1, a2, a3;
int main(){
double ans = 0;
scanf("%d%d%d%d%d", &n, &A, &B, &C, &a1);
a2 = a1;
int pst = a2 % C + 1, real;
for(int i = 2; i <= n; ++i){
a3 = ((long long)a2 * A + B) % 100000001;
real = a3 % C + 1;
ans += 1.0 / max(pst, real);
pst = real, a2 = a3;
}
real = a1 % C + 1;
ans += 1.0 / max(pst, real);
printf("%.3lf\n", ans);
return 0;
}