Single Round Match 798 Med - ExpectedValue
線形解法がおもったより単純だった
解法
(swap数の総和) (完全順列の数) を求める問題である
個の要素の完全順列の数
とすると,これは有名らしく,
で線形で求まる.
swap数は に辺を貼った時の サイクル長 だけかかる
サイクル長 となる,要素の選び方が でこれの並び方が で,残りの 個が完全順列となることを考えると,これが全体の総和に与える寄与は
となり全てのサイクル長について考えたらいい.
提出コード
struct ExpectedValue { int solve(int N) { COMinit(); vector<mint> subfactorial(N + 1); subfactorial[0] = 1; subfactorial[1] = 0; for (int i = 2; i <= N; i++) { subfactorial[i] = mint(i - 1) * (subfactorial[i - 1] + subfactorial[i - 2]); } mint res = 0; for (int cyc = 2; cyc <= N; cyc++) { res += mint(cyc - 1) * COM(N, cyc) * fac[cyc - 1] * subfactorial[N - cyc]; } res /= subfactorial[N]; return (int)res.x; } };