洛谷 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;
}
posted @ 2021-02-11 09:49  cymrain07  阅读(50)  评论(0)    收藏  举报
\