1. 程式人生 > 其它 >題解 P1297 [國家集訓隊]單選錯位

題解 P1297 [國家集訓隊]單選錯位

題解 P1297 [國家集訓隊]單選錯位

題意簡述

\(G\) 參加了一次考試,一共有 \(n\) 題,每題一分。第 \(i\) 道題有 \(a_i\) 個選項,小 \(G\) 原定每道題隨機選擇一個選項,但是她寫在答題卡上時,第 \(i\) 題的答案抄到了第 \(i+1\) 題上(第 \(n\) 題抄到了第一題),問小 \(G\) 的期望得分,保留三位小數。

\(1 \leq n \leq 10^7,1 \leq a_i \leq 10^8\)

Solution

考慮第 \(i\) 題得分的期望,最後總的期望得分就是每一題的期望得分的和,設上一題的選項有 \(last\) 個。

  • \(last>a_i\) ,則要先選中選項,概率為 \(\dfrac{a_i}{last}\)
    ,再從 \(a_i\) 個選項中選出正確答案概率是, \(\dfrac{1}{a_i}\) ,期望為 \(\dfrac{a_i}{last} \times \dfrac{1}{a_i} \times 1 = \dfrac{1}{last}\)
  • \(last < a_i\) ,那麼正確答案要是 \(1\sim last\) 中的一個才有可能選對,概率是 \(\dfrac{last}{a_i}\) ,再從 \(last\) 選項中選出正確答案,概率是 \(\dfrac{1}{last}\)。期望為 \(\dfrac{last}{a_i} \times \dfrac{1}{last} \times 1=\dfrac{1}{a_i}\)

綜上,每一題得分的期望為 \(\dfrac{1}{\max\{last,a_i\}}\),答案就全部加起來就可以了。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
const int N = 1e7 + 5;
int n ,A ,B ,C ,a[N]; double ans;
signed 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++)
		ans += (double)1.0 / max(a[i] ,a[i + 1]);
	ans += (double)1.0 / max(a[n] ,a[1]);
	printf("%.3f\n" ,ans);
	return 0;
}