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\),于是完成了证明。
然后我们的式子就是:
暴力可以直接展开多次,然后看之前的代码即可。
正解更为巧妙,我们令答案为 \(f(n, m, k) = \sum_{i = 1}^m[\gcd(i, k) = 1] \sum_{j = 1}^n [\gcd(i, j) = 1]\),然后有:
递归解决即可,对于 \(k = 1\) 的情况,可以直接莫反后杜教筛解决。