Official

H - Revenge of "The Salary of AtCoder Inc." Editorial by nok0


期待値の線形性を用いると、\(A_i\) 円支給される確率が各 \(i\) について求まればよいです。

更新された \(x\) を順に並べた列 \(v\) を考えます。求めたい確率は、\(v\) の中に \(i\) が含まれるような列全てに対する、その列が現れる確率の総和です。ここで、\(v\)\(i\) より大きい要素は関係ないことに注意すると、手順中に \(v\) の末尾が \(i\) になる確率の総和が求まればよいです。

\(v\) の長さを全探索することを考えると、求める確率として以下の式を得ます。

\[\sum _{k=1}^{k=i} \binom{i-1}{k-1}\frac{1}{N^k} =\frac{1}{N}\Big(1+\frac{1}{N}\Big)^{i-1}\]

\((1+\frac{1}{n})^{j}\)\(j=0,1,\ldots,N-1\) について列挙するのは \(\mathrm{O}(N)\) で出来るので、この問題を \(\mathrm{O}(N)\) で解くことができました。

なお、求める確率は式変形なしでより簡単に導出することもできます。\(j=1,2,\ldots,i-1\) について \(v\) に追加するかしないかを決めることを考えると、追加する場合は \(\frac{1}{N}\) 倍が付き 、追加しない場合は何も起こらないので結局同じ式が導かれます。

実装例(Python):

mod, n = 998244353, int(input())
a = list(map(int, input().split()))
p, q, res = pow(n, mod - 2, mod), 1 + pow(n, mod - 2, mod), 0
for v in a:
    res = (res + p * v) % mod
    p = (p * q) % mod
print(res)

posted:
last update: