競プロ頻出数値表・公式集
計算量見積もり・計算量削減
頻繁に用いる数値のサイズの見積もりや、畳み込みなどの公式を集めておきました。
数値表
計算量見積もりやデータ型の限界(オーバーフロー)確認に便利な概算表です。
2の累乗 \(2^n\)
| \(n\) | 正確な値 | 概算 |
|---|---|---|
| 10 | 1,024 | \(1.02 \times 10^3\) |
| 15 | 32,768 | \(3.28 \times 10^4\) |
| 20 | 1,048,576 | \(1.05 \times 10^6\) |
| 25 | 33,554,432 | \(3.36 \times 10^7\) |
| 30 | 1,073,741,824 | \(1.07 \times 10^9\) |
| 31 | 2,147,483,648 | \(2.15 \times 10^9\) |
| 40 | 1,099,511,627,776 | \(1.10 \times 10^{12}\) |
| 50 | 1,125,899,906,842,624 | \(1.13 \times 10^{15}\) |
| 60 | 1,152,921,504,606,846,976 | \(1.15 \times 10^{18}\) |
| 63 | 9,223,372,036,854,775,808 | \(9.22 \times 10^{18}\) |
※ \(2^{31}-1\) は32bit符号付き整数(int)の最大値、\(2^{63}-1\) は64bit符号付き整数(long long)の最大値です。
フィボナッチ数 \(F_n\)
| \(n\) | 正確な値 | 概算 |
|---|---|---|
| 10 | 55 | \(5.50 \times 10^1\) |
| 20 | 6,765 | \(6.76 \times 10^3\) |
| 30 | 832,040 | \(8.32 \times 10^5\) |
| 40 | 102,334,155 | \(1.02 \times 10^8\) |
| 45 | 1,134,903,170 | \(1.13 \times 10^9\) |
| 50 | 12,586,269,025 | \(1.26 \times 10^{10}\) |
| 60 | 1,548,008,755,920 | \(1.55 \times 10^{12}\) |
| 70 | 190,392,490,709,135 | \(1.90 \times 10^{14}\) |
| 80 | 23,416,728,348,467,685 | \(2.34 \times 10^{16}\) |
| 90 | 2,880,067,194,370,816,120 | \(2.88 \times 10^{18}\) |
※ \(F_{45}\) 付近で32bit上限を、\(F_{92}\) 付近で64bit上限を超えます。
二項係数 \({}_{2n}\mathrm{C}_n\)
| \(n\) | 正確な値 | 概算 |
|---|---|---|
| 10 | 184,756 | \(1.85 \times 10^5\) |
| 15 | 155,117,520 | \(1.55 \times 10^8\) |
| 20 | 137,846,528,820 | \(1.38 \times 10^{11}\) |
| 25 | 126,410,606,437,752 | \(1.26 \times 10^{14}\) |
| 30 | 118,264,581,564,861,424 | \(1.18 \times 10^{17}\) |
| 33 | 7,219,315,550,148,874,272 | \(7.22 \times 10^{18}\) |
※ 中央の二項係数は最も大きくなります。\(n=33\) (\({}_{66}\mathrm{C}_{33}\)) で64bit上限に近づきます。
階乗 \(n!\)
| \(n\) | 正確な値 | 概算 |
|---|---|---|
| 5 | 120 | \(1.20 \times 10^2\) |
| 8 | 40,320 | \(4.03 \times 10^4\) |
| 10 | 3,628,800 | \(3.63 \times 10^6\) |
| 12 | 479,001,600 | \(4.79 \times 10^8\) |
| 15 | 1,307,674,368,000 | \(1.31 \times 10^{12}\) |
| 20 | 2,432,902,008,176,640,000 | \(2.43 \times 10^{18}\) |
※ 順列の全探索 \(O(N!)\) が現実的なのは \(N=10 \sim 11\) 程度までです。
\(10^n\) 以下の素数の個数 \(\pi(X)\)
| \(n\) | 範囲 \(X = 10^n\) | 素数の個数 \(\pi(X)\) |
|---|---|---|
| 2 | 100 | 25 |
| 3 | 1,000 | 168 |
| 4 | 10,000 | 1,229 |
| 5 | 100,000 | 9,592 |
| 6 | 1,000,000 | 78,498 |
| 7 | 10,000,000 | 664,579 |
| 8 | 100,000,000 | 5,761,455 |
| 9 | 1,000,000,000 | 50,847,534 |
| 12 | 1,000,000,000,000 | 37,607,912,018 |
※ エラトステネスの篩の計算量や、素因数分解の個数見積もりに役立ちます。\(10^6\) 以下の素数は約7.8万個、\(10^9\) 以下は約5000万個です。
高度合成数(約数の個数)
| 高度合成数 \(N\) | 約数の個数 | 備考・主な閾値 |
|---|---|---|
| 7,560 | 64 | \(10^4\) 以下で最多 |
| 98,280 | 128 | \(10^5\) 以下で最多 |
| 720,720 | 240 | \(10^6\) 以下で最多(約数全探索が超余裕) |
| 7,351,344,000 | 1,344 | \(10^9\) 以下で最多(\(O(N\) の約数個数\()\) が余裕) |
| 9,637,611,984,000 | 6,720 | \(10^{12}\) 以下で最多 |
| 9,979,291,666,558,4000 | 26,880 | \(10^{18}\) 以下で最多(64bit型で約数最多) |
※ 「その数未満のどの自然数よりも約数の個数が多い数」です。\(10^9\) 以下の値でも約数は高々1344個、`long long` の限界付近でも26880個にしかならないため、約数を全列挙した後の処理は非常に高速に動作します。
公式集
サイズ $m$ の集合とサイズ $n$ の集合から合わせて $r$ 個を選ぶ方法は、全体の $m+n$ 個から $r$ 個を選ぶ方法に等しいという恒等式。
パスカルの三角形において、ある列に沿って足し合わせた和が斜め下の値に等しくなる性質。
全体からまず $k_1$ 個を選び、残りから $k_2$ 個、さらに残りから $k_3$ 個というように選んでいく過程に対応している。
$p$ を素数、$x$ を非負整数とする。$r$ を $p$ と互いに素な非負整数として、$x = rp^k$ と書けるとき、以下が成り立つ: $$x \equiv (r \text{ mod } p^e) \times p^k \pmod {p^e}$$
$P$ を置換として、$P(a\ b) = (P(a) P(b))P$ が成り立つ。
$P$ を置換として、$P (a_1\ a_2\ \dots\ a_k) P^{-1} = (P(a_1)\ P(a_2)\ \dots\ P(a_k))$ が成り立つ。
$x + y = x \oplus y + 2 (x \land y)$
$\left\lceil \frac{X}{M} \right\rceil = \left\lfloor \frac{X + M - 1}{M} \right\rfloor$
$\text{round}\left( \frac{X}{M} \right) = \left\lfloor \frac{2X + M}{2M} \right\rfloor$
整数 $X$ の $K$ 進法における $d$ 桁目の数字 (0-indexed):
$\left( \left\lfloor \frac{X}{K^d} \right\rfloor \bmod K \right) = \left\lfloor \frac{X}{K^d} \right\rfloor - K \cdot \left\lfloor \frac{X}{K^{d+1}} \right\rfloor$
頂点がすべて格子点上にある自己交差のない多角形の面積 $S$ は、内部の格子点の数を $I$、周上の格子点の数を $B$ とすると、 $S = I + \frac{B}{2} - 1$ が成り立つ。
有限群 $G$ が集合 $X$ に作用しているとき、同値類(軌道)の個数 $|X/G|$ は、各 $g \in G$ による固定点集合を $X^g = \{ x \in X \mid g \cdot x = x \}$ として、以下が成り立つ。 $$|X/G| = \frac{1}{|G|} \sum_{g \in G} |X^g|$$
平面グラフにおいて、頂点数を $V$、辺数を $E$、独立なサイクルの個数(内側の面の数)を $L$、連結成分の数を $C$ とすると、以下の関係式が成り立つ: $$C = V - E + L$$ (※ サイクルが存在しない森の場合は $L = 0$ となり、$C = V - E$ が成り立つ。)
木の直径の両端点を $u,v$ とすると、$u$ から最も距離が遠い頂点の一つが $v$ であり、逆も同様である。したがって、任意の頂点 $s$ から最も遠い頂点 $u$ を求め、さらに $u$ から最も遠い頂点 $v$ を求めれば、 $u,v$ は木の直径の両端点となり、 $$d(u,v)=\operatorname{diam}(T)$$ が成り立つ。この性質は、辺に非負の重みを付けた重み付き木でも、 距離を辺重みの総和として定義すれば成り立つ。
木 $T$ の頂点 $s$ を一つ固定する。 このとき、直径の両端点を $u,v$ とすれば、そのいずれかは $s$ から最も遠い点である。 なお、これは重み付きでも成立する。
2部グラフ $G = (U \cup V, E)$ において、$U$ のすべての頂点をカバーするマッチングが存在するための必要十分条件は、任意の $S \subseteq U$ に対して $|N(S)| \ge |S|$ が成り立つことである。ここで、$N(S)$ は $S$ に隣接する頂点の集合を表す。
無向グラフ $G$ と開始頂点 $s$ 上で行われる Undirected Vertex Geography において、先手必勝であるための必要十分条件は、$G$ のすべての最大マッチングが頂点 $s$ をカバーすること(すなわち、$s$ を含まない最大マッチングが存在しないこと)である。
多項式 $P(x)$ が $N + 1$ 個の点 $(x_i,y_i)$ を通るときの $P$ の明示的な式。
特に評価点が $x = 0, 1, \dots, N$ のように連続している場合、分母が階乗の積になり、分子の累積積を前計算しておくことで、通常 $O(N^2)$ かかる補間を $O(N)$ に落とすことができます。
$$ \text{達成するまでの回数の期待値} = (\text{1回以上かかる確率}) + (\text{2回以上かかる確率}) + \dots $$