洛谷 P1297 单选错位
洛谷 P1297 单选错位
题目大意
给 \(n\) 个单选题和每个单选题的选项个数 \(a_i\),假设每道题目都选择了正确选项但第 \(i\) 道题目的答案抄到了答题纸上的第 \(i+1\) 道题目的位置上,特别地,第 \(n\) 道题目的答案抄到了第 \(1\) 道题目的位置上。
求期望做对多少题目。
题解
- 求做对题目的期望值,可以把每道题目作做对的期望值相加。
- 要想做对一道题目,它前一道题目的正确选项必须和这道题目的正确选项相同。
- 两道题目的选项组合共有 \(a_i\times a_{i-1}\)种,做对的情况有 \(\min(a_i,a_{i-1})\) 种,所以做对该题的几率为 \(\cfrac{\min(a_i,a_{i-1})}{a_i\times a_{i-1}}\)。
- 所以最后的答案就是:
\[ans\gets\sum_{i=1}^n\cfrac{\min(a_i,a_{i-1})}{a_i\times a_{i-1}}
\]
代码
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int n, A, B, C, a[10000005];
double ans;
void in()
{
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;
}
void work()
{
a[n + 1] = a[1];//第n道抄到了第1道
for (int i = 2; i <= n + 1; i++)
ans += (double)min(a[i], a[i - 1]) / (double)a[i] / (double)a[i - 1];
printf("%.3lf", ans);
}
int main()
{
in();
work();
return 0;
}

浙公网安备 33010602011771号