1. 程式人生 > 其它 >UOJ221 [NOI2016] 迴圈之美

UOJ221 [NOI2016] 迴圈之美

牛牛是一個熱愛演算法設計的高中生。在他設計的演算法中,常常會使用帶小數的數進行計算。牛牛認為,如果在 \(k\) 進位制下,一個數的小數部分是純迴圈的,那麼它就是美的。現在,牛牛想知道:對於已知的十進位制數 \(n\)\(m\),在 \(k\) 進位制下,有多少個數值上互不相等的純迴圈小數,可以用分數 \(\frac xy\) 表示,其中 \(1≤x≤n,1≤y≤m\),且 \(x,y\) 是整數。一個數是純迴圈的,當且僅當其可以寫成以下形式:

\[a.\dot{c_1} c_2 c_3 \dots c_{p - 1} \dot{c_p} \]

其中,\(a\) 是一個整數,\(p≥1\)

;對於 \(1≤i≤p\)\(c_i\)\(k\) 進位制下的一位數字。
\(n \le10^9\)\(m \le 10^9\)\(k \le 2\times 10^3\)


  數學 結論 莫比烏斯反演 杜教篩

  這幾天 \(\tt LOJ\) 登不上,於是換成了 \(\tt UOJ\) 了,至少有兩個樣例,洛古只有一個樣例

  猜出了結論,然後只能一波暴力莫比烏斯反演獲得了 \(72\) 分的好成績

  然後就不會了……

  講一下怎麼猜到結論吧,首先我們對於 \(k\) 進位制下,迴圈節長度為 \(c\) 的小數 \(A\),一定有 \(k^c A - A = t\),其中 \(t\)

是一個整數,也就是如果一個分數 \(\frac{x}{y} = \frac{t}{k^c - 1}\),其中 \(1 \le x \le n, 1 \le y \le m\) 的話,一定是合法的。

  列舉所有 \(1 \le x \le n, 1 \le y \le m\) 的分數 \(\frac{x}{y}\),首先我們要求 \(\gcd(x, y) = 1\),然後考慮什麼分數不合法,然後猜以下,如果 \(\gcd(y, k) \neq 1\),那麼一定不合法,我們只能初步判定有兩個條件,無法說明其正確性,但是隻要暴力跑一下第 \(2\) 組樣例(可能要十幾分鍾),然後就可以發現這個是正確的了!


  以上是我發現的過程,好像證明也差不多,可以根據 \(k^c A - A = t\) 展開,得到 \((k^c - 1)x = ty\),然後有 \(k^cx \equiv x \pmod y \Leftrightarrow k^c \equiv 1 \pmod y \Leftrightarrow \gcd(k, y) = 1\),於是完成了證明。


  然後我們的式子就是:

\[\begin{aligned} &\sum_{i = 1}^m[\gcd(i, k) = 1] \sum_{j = 1}^n [\gcd(i, j) = 1]\\ \end{aligned} \]

  暴力可以直接展開多次,然後看之前的程式碼即可。

  正解更為巧妙,我們令答案為 \(f(n, m, k) = \sum_{i = 1}^m[\gcd(i, k) = 1] \sum_{j = 1}^n [\gcd(i, j) = 1]\),然後有:

\[\begin{aligned} &f(n, m, k)\\ =&\sum_{i = 1}^m[\gcd(i, k) = 1] \sum_{j = 1}^n [\gcd(i, j) = 1]\\ =&\sum_{d | k} \mu(d) \sum_{i = 1}^{\left\lfloor\frac{m}{d}\right\rfloor} \sum_{j = 1}^n [\gcd(i, j) = 1][\gcd(d, j) = 1]\\ =&\sum_{d | k} \mu(d) f(\left\lfloor\frac{m}{d}\right\rfloor, n, d) \end{aligned} \]

  遞迴解決即可,對於 \(k = 1\) 的情況,可以直接莫反後杜教篩解決。

  程式碼