ベル数を $B_0$ から $B_n$ まで列挙する
lib/combinatorics/bell.hpp
概要
形式的冪級数 $\exp(\exp(x)-1)$ からベル数を求める。
インクルード
#include "combinatorics/bell.hpp"
関数
| 名前 | 説明 |
|---|---|
bell |
ベル数を $B_0$ から $B_n$ まで列挙する |
検証
依存するヘッダ(11)
-
二項係数・階乗・順列・多項係数・重複組合せ
lib/combinatorics/combinatorics.hpp -
形式的冪級数 (FPS)
lib/convolution/formal_power_series.hpp -
NTT・畳み込み (convolution)
lib/convolution/ntt.hpp -
Montgomery + AVX2 による NTT 畳み込み (NTT-friendly な 32bit 素数 mod 専用)
lib/convolution/ntt_avx2.hpp -
internal/internal_fft.hpp
lib/internal/internal_fft.hpp -
internal/internal_fft_avx2.hpp
lib/internal/internal_fft_avx2.hpp -
internal/internal_fps_avx2.hpp
lib/internal/internal_fps_avx2.hpp -
internal/internal_math.hpp
lib/internal/internal_math.hpp -
internal/internal_type_traits.hpp
lib/internal/internal_type_traits.hpp -
modint (static_modint / dynamic_modint)
lib/number_theory/modint.hpp -
素数法上で `x` の平方根を 1 つ返す
lib/number_theory/root_mod.hpp
検証プログラム(1)
-
test/yosupo/enumerative_conbinatorics/bell_number.test.cpp
test/yosupo/enumerative_conbinatorics/bell_number.test.cpp
実装
#pragma once
#include <vector>
#include "convolution/formal_power_series.hpp"
/// @brief ベル数を $B_0$ から $B_n$ まで列挙する
/// @details 形式的冪級数 $\exp(\exp(x)-1)$ からベル数を求める。
/// @tparam mint NTTを利用できる static modint 型
/// @param n 求める最大の添字。0以上であること
/// @return 長さ $n+1$ の列。i番目の要素はベル数 $B_i$
/// @complexity $O(n\log n)$
template <internal::static_modint_c mint>
std::vector<mint> bell(int n) {
if (n == 0) return std::vector<mint>(1, mint(1));
std::vector<mint> res(n + 1);
res[1] = 1;
res = fps::exp(res);
res[0] -= 1;
res = fps::exp(res);
mint mul = 1;
for (int i = 0; i <= n; ++i) {
res[i] *= mul;
mul *= i + 1;
}
return res;
}