ARC116 C - Multiple Sequences

これが水diffって嘘だよな......

エスパーで通してしまった。解説見てなるほどな〜になった

https://atcoder.jp/contests/arc116/tasks/arc116_c

問題概要

以下の条件を満たす長さ  N の整数列  A の個数を求めよ。

  •  1 \leq A_i \leq M
  •  A_{i+1} A_i の倍数

解説

問題を見ると、 \mathrm{dp}[i][j] ...  i 番目の要素が  j である  A の個数 という自明な DP が思い浮かぶが、これは解けない(コンテスト中はずっとこれの高速化を考えてしまった)。

末尾の要素を固定するといい感じに数えられそうな予感がする。末尾の要素を固定し、それぞれに対して  A の個数を高速に求めることを考える。

 A の要素数 N+1 だと考え、 A_0 = 1 としても問題ない。最初の要素も固定されるので嬉しい。

 A_N = k のときを考える。 A_0 \rightarrow A_1, A_1 \rightarrow A_2, \ldots , A_{N-1} \rightarrow A_N それぞれに  k の素因数を配る感じになる。

このとき、素因数ごとに独立に考えて良い。つまり、 k = p^{a} q^{b} r^{c} \ldots素因数分解すると、 p, q, r, \ldots は独立に考えてよい。

 a 個の  p N 個の箱に配ればよくて、これは  \dbinom{a+N-1}{N} 通りである。それぞれの素因数に対するこの値の総積が、末尾が  k のときの答え。あとは  1 から  M まで足せばよい。

素因数の個数の和は調和級数を考えると  O(M \log M) で抑えられるので、間に合う。

反省

DP から抜け出すのが遅かった。末尾固定は考えられたが、 A_0 = 1 を追加し最初の項も固定するとより考えやすくなったので、吸収したい。組み合わせの基本的なところ(写像 12 相など)がパッとできないので訓練したい......。

提出コード

https://atcoder.jp/contests/arc116/submissions/25294568