from typing import Callable
from typing import Dict


def expected_utility(u: Callable[[float], float], X: Dict[int, float]) -> float:
    """
    効用関数uの下で確率くじXのもたらす期待効用を返します。

    Parameters
    ----------
    u: Callable[[float], float]
        効用関数
    X: Dict[int, float]
        確率くじ。X[k] = p とすると確率くじXは確率pでk円になることを表す。
        Xのkeyをk_1, ..., k_n とするとき、X[k_1] + ... + X[k_n] = 1を満たす必要がある。

    Returns
    -------
    float
        u(X)の期待値
    """

    return sum(p * u(k) for k, p in X.items())