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\) 的情况,可以直接莫反后杜教筛解决。

  代码

posted @ 2022-03-24 15:08  Werner_Yin  阅读(44)  评论(0编辑  收藏  举报