題解 P1297 [國家集訓隊]單選錯位
阿新 • • 發佈:2021-09-03
題解 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}\)
- 若 \(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; }