Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 227 G 問題 Divisors of Binomial Coefficient

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

二項係数  \dbinom{N}{K} の正の約数の個数を求めよ.

制約

  •  1 \leq N \leq 10^{12}
  •  1 \leq K \leq \min (10^6,N)

解法

約数に関する問題なので, 素因数分解に着目する.

 \dbinom{N}{K}=\dfrac{N(N-1) \cdots (N-K+1)}{K (K-1) \cdots 2 \cdot 1}

である. ここで,  \mathbb{P} で正の素数全体の集合として,

 \displaystyle N(N-1) \cdots (N-K+1)=\prod_{p \in \mathbb{P}} p^{a_p},\quad K(K-1) \cdots 2 \cdot 1=\prod_{p \in \mathbb{P}} p^{b_p}

で表せるとき, 各素数  p \in \mathbb{P} に対して,  e_p:=a_p-b_p とすると, 任意の素数  p に対して,  e_p \geq 0 であり,

 \displaystyle \dbinom{N}{K}=\prod_{p \in \mathbb{P}} p^{e_p}

である. よって,  a_p, b_p を求めることを目標にする.

さて, 2つの正の整数  X,Y について,

 \displaystyle X=\prod_{p \in \mathbb{P}} p^{x_p}, \quad Y=\prod_{p \in \mathbb{P}} p^{y_p} \Rightarrow XY=\prod_{p \in \mathbb{P}} p^{x_p+y_p}

であるから, 結局は  1,2, \dots, K-1,K と,  N-K+1, \cdots, N-1,N の高々  2K 個の整数に関する素因数分解が求められればよい.

ここで,  N \leq 10^{12}, K \leq 10^6 なので, 試し割り方やポラード・ロー素因数分解法では無理がある. しかし,  N-K+1, \cdots, N-1,N が連続した  K 個の整数であるから, 以下のような方法を取ることができる.

 a_p, b_p を求める.

 \sqrt{N} 以下の素数を全て求める. これはエラトステネスの篩で計算できる. そして,  \sqrt{N} 以下の素数素因数分解したい  K 個の整数を割り切り,  a_p を計算する.  \sqrt{N} 以下の素数を全て見た場合, 残った整数は  1 以外の可能性があるが,

整数  L において,  \sqrt{L} より大きい素因数は高々1つだけである.

という事実から, 残った  1 以外の整数は素数である.

実装は  1,2, \cdots, L それぞれにおける最小の素因数を求める方法と同様に,  a_p を計算することにより, 計算量は  M:=\min(K, \sqrt{N}) として,  O(M \log \log M) である.

 b_p の場合も同様であり, 計算量も  O(K \log \log K) である.

約数の個数を求める.

素因数分解が求まったので, 約数の個数を求める.

 \displaystyle L=\prod_{q \in \mathbb{P}} q^{u_q} の正の約数の個数は  \prod_{q \in \mathbb{P}} (1+u_q) 個である.

という事実から, 求めるべき答えは,

 \displaystyle \prod_{p \in \mathbb{P}} (1+e_p)

である.