数え上げ

式変形で解こうとすると沼にハマる。

すべてのxxについて f(x) \sum{f(x)}を計算する→f(x)=y f(x) = yとなるようなxxはいくつあるか?

数え上げる対象をうまく類別できるかどうかを考える

類別する方法 Sを部分文字列として含む文字列は、Sを取り出す位置の列の内、辞書順最小であるもので類別できる

ある列が与えられた時に、一意に決まるような量を考える

xから計算できる量の内、最大/最小のものを考えるとうまく行く?

e.g. 最大公約数 辞書順最小

式を組み合わせと見なす

エイシング 2020 F Two Snuke

ドワンゴ 2020 予選 C Cookie Distribution

公式

数列の和

i=1ni2=16n(n+1)(2n+1)\sum_{i=1}^{n}{i^2} = \frac{1}{6} n (n+1) (2n+1)

Si=k=0nkiS_i = \sum_{k=0}^{n}{k^i}とおくと、

S0=n+1S_0 = n+1
Si=1i+1{(n+1)i+1j=0i1i+1CjSj}S_i = \frac{1}{i+1} \left\{ (n+1)^{i+1} - \sum_{j=0}^{i-1}{_{i+1}\mathrm{C}_{j}S_j} \right\}

H(n,m)H(n,m) = 格子上での(0,0)(0,0)から(n,m)(n,m)への最短経路の個数と定義すると、

H(n,m)=i=0mH(n1,i)H(n,m)= \sum_{i=0}^{m}{H(n-1,i)}

S(n,m)S(n,m) = nn個のものをちょうどmm個の空でないグループに分割する方法の個数と定義する時、

S(n+1,m+1)=i=0nnCiS(i,m)=i=mnnCiS(i,m)S(n+1,m+1)= \sum_{i=0}^{n}{_n\mathrm{C}_i}S(i,m) = \sum_{i=m}^{n}{_n\mathrm{C}_i}S(i,m)
k=0nnCk=2n\sum_{k=0}^{n} {}_n \mathrm{C}_k = 2^n
k=0nknCk=n2n1\sum_{k=0}^{n} k {}_n \mathrm{C}_k = n 2^{n-1}

包除原理

f(ST)=f(S)+f(T)f(ST)f(S \cup T) = f(S) + f(T) - f(S \cap T) を満たすならば、

集合S1,,SnS_1, \dots , S_nがあるとき、

f(1inSi)=T{1,,n}(1)Tf(iTSi)f\left(\overline{\bigcup_{1 \le i \le n} {\overline{S_i}}} \right) = \sum_{T \subseteq \{1, \dots, n\}} (-1)^{|T|} f\left(\bigcap_{i \in T} S_i \right)