初項0、公差1の等差数列の累積XOR和をとったときに周期性が現れます。
| 要素 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| XOR | 0 | 1 | 3 | 0 | 4 | 1 | 7 | 0 | 8 | 1 | 11 | 0 | 12 | 1 | 15 | 0 |
\begin{alignat*}{1}
\left\{
\begin{array}{ll}
i &(i \bmod 4 = 0)\\
1 &(i \bmod 4 = 1)\\
i + 1 &(i \bmod 4 = 2)\\
0 &(i \bmod 4 = 3)
\end{array}
\right.
\end{alignat*}
</details>
周期性のある部分の個数を記号に置き換える
★
たとえば11001100...という1と0からなる数列の、$N$番目までの1の個数を数えるときに、周期性のある部分の個数を$C$とおくことで、1の個数を$C \times 2 + \min((N - C \times 4), 4)$という一つの式で表せます($\min$の部分はAdhocな考察が必要です)。そして$C$についても、$C = \lfloor N / 4 \rfloor$という簡単な計算で求めることができます。
ランレングス圧縮
★
優先度付きキュー
★
★
★
★
XORは桁毎に見る
★
★
★
コイン両替問題のDP
★
dp配列から文字列を復元
★
★
最小値(最大値)を保持しながら数列を探索
★
$O(N!)$全探索
★
next_permutation()を使って$N!$通りの探索を行います。
二分探索
★
★
modの累積和を取る
★
絶対値は符号を両方試す
★
1桁目が1の素数を5個足せば合成数になる
★
$_nC_r$の値は、$n$が大きいほど大きくなり、$r$が$n / 2$に近づくほど大きくなる
★
ワーシャルフロイド法
★
★
★
ベルマンフォード法
★
傾き1の直線を傾き0の直線にする
★
Win-Lose Algorithm
★
イベントソート
★
座標圧縮
★
セグメントツリー
★
$\sum$の交換、$\sum$の分解
★
★
★
以下の数式を利用することで、計算量を落とせることがあります。
$$\sum_{i=1}^m (a_i + b_i) = \sum_{i=1}^m a_i + \sum_{i=1}^m b_i$$
$$\sum_{i=1}^m \sum_{j=1}^n a_{ij} = \sum_{j=1}^n \sum_{i=1}^m a_{ij}$$
$$\sum_{i=1}^m \sum_{j=1}^n a_ib_j = \sum_{i=1}^m a_i \sum_{j=1}^n b_j $$
約数の個数分だけ全探索
★
$1 \le N \le 10^9$を満たす$N$の、約数の個数の最大は$1344$個($N = 73513440$)。この少なさを利用して計算量を落とせることがあります。ちなみに、約数の列挙は$O(\sqrt N)$でできます。
next(int i, char c)という関数を定義する
★
3つのうちの真ん中を固定
★
2冪の網羅性
★
$f(x) = |x - a| + b$という形で表せる関数は凸関数
★
凸関数同士を足すと凸関数になる
★
数直線上に複数の点があるとき、すべての点との距離の和が最小となる位置は、中央の点の位置
★
木DP
★
Trie木
★
Grundy数
★
bitDP
★
木の直径
★
DFSを2回すれば求まります。
補グラフを考える
★
$\times 2$と$+ 1$($\times 10$と$+ 1$)
★
★
Binary Indexed Tree
★
★
転倒数
★
★
最小カット
★
01BFS
★
変数を減らす
★
非負整数の最適化問題を、数列の問題に言い換える
★
$10^9 + 7$で割った余り
★
★
★
★
★
★
貪欲法
★
★
★
★
Adhocな解法
★
★
★
★
★
★
★
★
★
★
★