AtCoder Beginner Contest 230 F,G問題メモ
平日コン、のーみそが疲れてると問題文の内容が頭に入ってこない。
F - Predilection
問題
- 長さ $N$ の数列 $A_1~A_N$
- 隣り合う2要素を、その和の1要素に置き換える、という操作を何度でも行える
- 最終的な数列としてあり得るものは何通りか、$\mod{998244353}$ で求めよ
- $1 \le N \le 2 \times 10^5$
- $|A_i| \le 10^9$
解法
累積和で考える。
$A$ の累積和を $B$ 、最終的な数列の一例を $C$ 、その累積和を $D$ とする。
すると $D$ は、$B$ からいくつかを(順番を変えずに)かいつまんだ部分列と見ることができる。
(ただし最後の $B_N$ は必ず使う)
A 1 0 2 1 -3 2 1 0 B 1 1 3 4 1 3 4 4 |--> > |-----------> C 1 2 1 D 1 3 4
$C$ と $D$ は1対1対応するので、$D$ の個数を数えればよい。
列として同じになってしまうものが存在するので、それを重複して数えてはいけない。
i 1 2 3 4 5 6 7 8 -------------------------- A 1 0 2 1 -3 2 1 0 B 1 1 3 4 1 3 4 4 > |-----------> |--> C 1 2 1 上の例とC,Dが同じ D 1 3 4
DPで考える。
- $DP[i]=i$ 番目の要素まで考えて、$i$ 番目の要素は必ず使うときの、$B$ から取れる部分列の個数
遷移は、基本的には $DP[1]~DP[i-1]$ のそれぞれから遷移できて以下のようになる。
- $\displaystyle \sum_{j=1}^{i-1}DP[j]$
ただし、複数含まれる要素は最後の1要素からしか遷移できない。
i 1 2 3 4 5 6 7 8 -------------------------- B 1 1 3 4 1 3 4 4 * DP[7] へ遷移できるのは * * * この3つだけ i=3 と i=6 は Bi が 3 で同じ。 DP[3] に数えられている具体的な部分列は (1 3) (1 1 3) などがあるが、 これらは必ず全て、DP[6]にも数えられている。
これは、$i=1,2,...$ と $DP$ を求めていく過程で、「要素 $a$ が最後に出現した $i$」を辞書型などで更新していくとよい。
$O(N)$ で最後まで求められる。
G - GCD Permutation
問題
- $1,..,N$ の順列 $P_1,...,P_N$ が与えられる
- 以下を全て満たす $(i,j)$ の組の個数を $\mod{998244353}$ で求めよ
- $1 \le i \le j \le N$
- $GCD(i,j) \neq 1$
- $GCD(P_i,P_j) \neq 1$
- $1 \le N \le 2 \times 10^5$
- 時間制限: 5sec.
解法
基本的に公式Editorialの踏襲。
GCD条件が1つの場合
仮に、$GCD(P_i,P_j) \neq 1$ を無視して $GCD(i,j) \neq 1$ だけに絞って考えると、
- 互いに2の倍数だったら当てはまる
- 互いに3の倍数だったら当てはまる
- ……
と、互いに何らかの数の倍数だったら当てはまる。
たとえば2の倍数は $\dfrac{N}{2}$ 個(切り捨て)あるので、
これを $s$ とおくと $\dfrac{s(s+1)}{2}$ 個のペアが存在する。
(この問題では自分自身とのペアも許される点に注意)
$a=2~N$ について、$a$ の倍数の中で作れるペアの個数 $Pair(a)=\dfrac{\frac{N}{a}(\frac{N}{a}+1)}{2}$ を合計すると答え……にはならない。
重複が発生するので、上手く除かないといけない。
たとえば6と12は、$2,3,6$ の3回で数えられてしまう。
メビウス関数
そういうときに便利に使えるのがメビウス関数(を改変したもの)となる。
包除原理の約数特化版みたいな感じ。
- 本来の メビウス関数 は「互いに素なもの」の個数を数える時などに使うため、下記と少し異なる
\[ \tilde{\mu}(n)= \begin{cases} 1 & (nが相異なる奇数個の素数の積で表されるとき (n=2,3,30 など) ) \\ -1 & (nが相異なる偶数個 (0 を含まない) の素数の積で表されるとき (n=6,10,210 など) ) \\ 0 & (それ以外のとき (n=1,4,8,9,12 など) ) \end{cases} \]
2以上のどんな整数についても、約数の $\tilde{\mu}(x)$ を足し合わせると、必ず $1$ になるという性質を持つ。
なので、6と12の場合も、
- $\tilde{\mu}(2),\tilde{\mu}(3)$ は1なので、その倍数から作られるペアは $1$ 回ずつ数えられる
- $\tilde{\mu}(6)=-1$ なので、その倍数から作られるペアは $-1$ 回数えられる(負に寄与する)
とすると、きちんと重複をのぞける。
よって、$1~N$ で互いに素でない組の個数は、$\displaystyle \sum_{a=2}^{N}\tilde{\mu}(a)Pair(a)$ となる。
二重化
さて、これでGCD条件が1つの場合は答えを求められた。
しかし今回はGCD条件が2つある。
$a=2~N$ について、添字が互いに $a$ の倍数である $P_a,P_{2a},P_{3a},...$ の中に限定して、
再び $b=2~N$ について「2の倍数の個数」……「$N$ の倍数の個数」を調べていけば答えは求まる。
$g(a,b)$ を「添字が $a$ の倍数である $P_i$ に限定した中での $b$ の倍数の個数」とすると、 $\displaystyle \sum_a \sum_b \tilde{\mu}(a)\tilde{\mu}(b)\dfrac{g(a,b)(g(a,b)+1)}{2}$ が答えとなる。
添字ならば規則的に並んでいるため「$a$ の倍数の個数」は割り算で求められたが、 抽出された中では「$b$ の倍数の個数」は実際に全部試すしかない。 そのためこれを愚直に行うと、計算量は全体で $O(N^2)$ となってしまう。
しかし、個数が限定されている場合、メビウス関数の性質も併せて考えると、実は調べるべき $b$ はそれほど多くない。
$b$ の方を1つ1つ試すのではなく、各 $P_a,P_{2a},...$ について、それらが持つ約数の方からアプローチする。
つまり、「$count[b]=b$ を約数に持つ、限定された中での $P_i$ の個数」とした記録用辞書を作っておき、
たとえば $P_i$ が $2,3,6$ を約数に持つのであれば、$count[2],count[3],count[6]$ にそれぞれ+1する。
$P_a,P_{2a},...$ についてこれを行えば、$count$ から各値を約数に持つ $P_i$ が何個あるかがわかる。
だがそれでも、約数は $N \le 2 \times 10^5$ の中では最大 $160$ 個とかになり、言語によってはやや厳しい。
さらに絞ると、同じ素因数を2個以上含む約数は $\tilde{\mu}(x)$ が $0$ になる(答えへの寄与も0)ので、
約数のうちそれらは無視できる。
$P_i$ が $2^p3^q5^r$ という風に素因数分解できるなら、
$count$ に記録すべき約数は、$2,3,5$ をそれぞれ含むか含まないか、から $1$ を除いた $2^3-1=7$ 通りだけでよい。
これなら、$P_i \le 2 \times 10^5$ の範囲で素因数の種類数はたかだか $6$ 個(考慮すべき約数は $2^6-1=63$ 個)、 しかもそんな特異な数は限られていて多くはせいぜい $1~3$ 個くらいなので、間に合う。
まとめ
あらかじめ、$1~N$ について「$\tilde{\mu}(x)$」および「約数のうち $\tilde{\mu}(x)$ が0でないもののリスト」を計算しておく。
$a=2~N$ について、以下の要領で $P_a,P_{2a},...$ を調べていく。
- 空の記録用辞書 $count$ を作る
- $P_a,P_{2a},...$ について、約数リストに存在する数について、$count[b]+=1$ としていく
- 最終的に $count$ に記録された各 $(b, cnt)$ につき、$\tilde{\mu}(a)\tilde{\mu}(b)\dfrac{cnt(cnt+1)}{2}$ を答えに加算する
$1~N$ の素因数の種類数の最大値を $d(N)$ として、$O(2^{d(N)} N \log{N})$(実際はもっと少ない)で求められる。