難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) Lv.7.0 (1票)

投票の分布
  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.71票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

1000000D Hypercube

作成者 npnp

難易度(作成者設定) Lv.6

難易度(投票) Lv.7.0 (1票)

実行時間制限
2 秒
メモリ制限
512 MiB

部分点あり(満点500点)

  • 小課題11点
  • 小課題2499点

解説

方針

x1+x2+⋯+xN=Kx_1+x_2+\cdots+x_N=Kを満たす平面で[0,1]N[0,1]^Nの超立方体をぶった切ったとき原点を含む方の体積は[0,1][0,1]から一様ランダムにNN個実数を選んだときの総和がKK以下となる確率と等しいので、以下その確率を計算する。

確率変数の定義

[0,1][0,1]上の一様分布に従うNNこの独立な確率変数をxi(1≤i≤N)x_i (1\leq i \leq N)とし、総和をSNS_Nとする。各変数の確率密度関数f(x)f(x)は0≤x≤10\leq x \leq 1となる関数、すなわちf(x)=U(x)−U(x−1)f(x)=U(x)-U(x-1)である。 N=iN=iのときの確率密度関数をfif_iとする。

畳み込み

N=2N=2のとき確率密度関数は、足してxxになるように畳み込み、以下のようになる。

f2(x)=∫−∞∞f1(t)f1(x−t)dtf_2(x) = \int_{-\infty}^\infty f_1(t)f_1(x-t) dt

N=3N=3ではf2(x)f_2(x)とf1(x)f_1(x)の畳み込みである。N>3N>3でも同様。

ここで、

L[fn(x)](s)=L[fn−1(x)∗f1(x)](s)=L[fn−1(x)](s)L[f1(x)](s)\begin{align*} \mathcal{L}[f_n(x)](s)&=\mathcal{L}[f_{n-1}(x)*f_1(x)](s) \\ &=\mathcal{L}[f_{n-1}(x)](s)\mathcal{L}[f_1(x)](s) \\ \end{align*}

となり再帰的に適用すれば

L[fn(x)](s)=(L[f1(x)](s))N=(1−e−ss)N=(1−e−s)NsN=∑k=0N(−1)k(Nk)e−kssN\begin{align*} \mathcal{L}[f_n(x)](s)&=(\mathcal{L}[f_1(x)](s))^N \\ &=\left(\frac{1-e^{-s}}{s}\right)^N\\ &=\frac{(1-e^{-s})^N}{s^N}\\ &=\frac{\sum_{k=0}^{N}(-1)^k \binom{N}{k}e^{-ks}}{s^N} \end{align*}

となる。これを逆ラプラス変換すると、

L−1[∑k=0N(−1)k(Nk)e−kssN](x)=1(N−1)!∑k=0N(−1)k(Nk)(x−k)N−1U(x−k)\begin{align*} \mathcal{L}^{-1}\left[\frac{\sum_{k=0}^{N}(-1)^k \binom{N}{k}e^{-ks}}{s^N}\right](x)&= \frac{1}{(N-1)!}\sum_{k=0}^{N} (-1)^k \binom{N}{k} (x-k)^{N-1}U(x-k) \end{align*}

求めるものはこれの[0,K][0,K]上定積分の値なので、

∫0K1(N−1)!∑k=0N(−1)k(Nk)(x−k)N−1U(x−k)dx=[1N!∑k=0K(−1)k(Nk)(x−k)NU(x−k)]0K=1N!∑k=0K(−1)k(Nk)(K−k)N\begin{align*} &\int_{0}^{K}\frac{1}{(N-1)!}\sum_{k=0}^{N} (-1)^k \binom{N}{k} (x-k)^{N-1}U(x-k) dx\\ =&\left[\frac{1}{N!}\sum_{k=0}^{K} (-1)^k \binom{N}{k} (x-k)^{N}U(x-k)\right]_{0}^{K}\\ =&\frac{1}{N!}\sum_{k=0}^{K} (-1)^k \binom{N}{k} (K-k)^{N} \end{align*}

あとは適切に実装すればよいです。全体としてO(Nlog⁡N)O(N\log N)で解けて十分高速です。

ユーザー解説

ユーザー解説を書く