洛谷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=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\) 的倍數的個數。所以
這樣就做完了。還可以再化簡整理一下:
\[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} \]