1. 程式人生 > 其它 >洛谷P3172 [CQOI2015]選數

洛谷P3172 [CQOI2015]選數

洛谷P3172 [CQOI2015]選數

給定正整數 \(N,K,L,H\)
\([L,H]\) 內選 \(N\) 個整數,易知共有 \((H-L+1)^N\) 種方案。
而我們要求的是 \(N\) 個數的最大公約數為 \(K\) 的方案數。對 \(10^9+7\) 取模。

\(1\le N,K\le 10^9,1\le L\le H\le 10^9,H-L\le 10^5\)

\(l=\lceil\frac LK\rceil,r=\lfloor\frac HK\rfloor\),顯然原問題等價於:
\([l,r]\) 內選 \(N\) 個整數,使其最大公約數為 1,求方案數。

\(D=r-l\)


\(f_i\) 表示在 \([l,r]\) 內選 \(N\) 個不全相同的整數,使其最大公約數為 \(i\) 的方案數。
Q: 為啥要讓 \(N\) 個數不全相同?
A: 這樣規定之後,\(\forall i>D\),有 \(f_i=0\),接下來只需考慮 \(f_1\sim f_D\)

再設 \(F_i\) 表示在 \([l,r]\) 內任選 \(N\) 個不全相同的整數,使 \(i\) 是其公約數的方案數。
\([l,r]\)\(i\) 的倍數的個數為 \(S(i)=\lfloor\frac ri\rfloor-\lfloor\frac{l-1}i\rfloor\)

,易知 \(F_i=S(i)^N-S(i)\)

接下來可以容斥了:

\[f_i=F_i-f_{2i}-f_{3i}-\cdots \]

\(i=D\) 開始倒推即可。
最終的答案是 \(f_1+[l=1]\)。(當 \(l=1\) 時,全選 1 也是一種方案)

時間複雜度 \(O(D\log D)\)

下面再提供一種純數論做法。

首先,我們有

\[ans=\sum_{d=1}^r\mu(d)S(d)^N \]

可以大力推式子得到,不詳細寫了。

然後我們發現 \(r\) 是 1e9 級別的,線性篩跑不動。
其實杜教篩可以,然而 CQOI2015 時杜教篩尚未普及,因此這是不講武德的。

注意到 \(d>D\) 時,\(S(d)=0\)\(1\),故 \(S(d)^N=S(d)\)

\[ans=\sum_{d=1}^D\mu(d)S(d)^N+\sum_{d=D+1}^r\mu(d)S(d) \]

把第二個式子差分一下:

\[\sum_{d=D+1}^r\mu(d)S(d)=\sum_{d=1}^r\mu(d)S(d)-\sum_{d=1}^D\mu(d)S(d) \]

考慮化簡 \(\sum\limits_{d=1}^r\mu(d)S(d)\)
\(S(d)\) 的定義是 \([l,r]\)\(d\) 的倍數的個數。所以

\[\begin{aligned} \sum_{d=1}^r\mu(d)S(d) &=\sum_{d=1}^r\sum_{i=l}^r[d|i]\mu(d)\\ &=\sum_{i=l}^r\sum_{d\mid i}\mu(d)\\ &=\sum_{i=l}^r[i=1]\\ &=[l=1] \end{aligned}\]

這樣就做完了。還可以再化簡整理一下:

\[ans=\sum_{d=1}^D\mu(d)\left(S(d)^N-S(d)\right)+[l=1] \]

線性篩 + 整除分塊可以做到 \(O(D+\sqrt D\log N)\) 計算。

其實容斥做法也能得出一模一樣的式子,只要做一次莫比烏斯反演即可:

\[F_i=\sum_{i|d}f_d\Longleftrightarrow f_i=\sum_{i|d}\mu(d)F_d \] \[\begin{aligned}ans&=f_1+[l=1]\\&=\sum_{d=1}^D\mu(d)F_d+[l=1]\end{aligned} \]