[BZOJ 2134]單選錯位

Description

題庫連接php

共有 \(n\) 道單選題,第 \(i\) 道單選題有 \(a_i\) 個選項,這 \(a_i\) 個選項編號是 \(1,2,3,…,a_i\),每一個選項成爲正確答案的機率都是相等的。你把答案抄到答題紙上,沒想到抄錯位了:第 \(i\) 道題目的答案抄到了答題紙上的第 \(i+1\) 道題目的位置上,特別地,第 \(n\) 道題目的答案抄到了第 \(1\) 道題目的位置上。假設你沒有作錯任何題目,只是答案抄錯位置,求指望能作對幾道題目。c++

\(2\leq n\leq 10000000,1\leq a_i\leq 100000000\)spa

Solution

假設第 \(i\) 道題有 \(x\) 個選項,第 \(i+1\) 題有 \(y\) 個選項。code

  1. \(x=y\),顯然此時作對第 \(i+1\) 題的機率 \(p=\frac{1}{x}=\frac{1}{y}\)
  2. \(x>y\),由條件機率的思想,作對第 \(i+1\) 題的機率爲第 \(i\) 題的選項在 \(i+1\) 題中可行的前提下,在 \(i+1\) 題中正確的機率,那麼 \(p=\frac{y}{x}\times\frac{1}{y}=\frac{1}{x}\)
  3. \(x<y\),同理,作對第 \(i+1\) 題的機率爲第 \(i+1\) 題的正確選項在 \(i\) 題中可行時選中的機率,那麼 \(p=\frac{x}{y}\times\frac{1}{x}=\frac{1}{y}\)

綜上,作對第 \(i+1\) 題的機率爲 \(p=\frac{1}{\max\{a_{i},a_{i+1}\}}\)ip

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 10000000+5;

int n, A, B, C, a[N];
double ans;

int main() {
    scanf("%d%d%d%d%d", &n, &A, &B, &C, a+1);
    for (int i = 2; i <= n; i++)
        a[i] = (1ll*a[i-1]*A+B)%100000001;
    for (int i = 1; i <= n; i++)
        a[i] = a[i]%C+1;
    for (int i = 2; i <= n; i++)
        ans += 1./max(a[i], a[i-1]);
    ans += 1./max(a[n], a[1]);
    printf("%.3lf\n", ans);
    return 0;
}
相關文章
相關標籤/搜索