..D
限时每日一题day24。一道纯数学题,结论非常简单,但还是想再复盘一下推导的过程。
先说结论:
- \(kind1\) 成立:\(b^{k} \equiv 0 (mod\space n)\)
- \(kind2\) 成立:\(b^{k} \equiv 1 (mod\space n)\)
- \(kind3\) 成立:\(b^{k} \equiv n - 1 (mod\space n)\)
对于三种情况,分别找到使对应同余式成立的最小的 \(k\),再取三者 \(min\) 即为答案。三种情况都找不到合法的 \(k\) 则无解。
下面证明一下上述三条结论:
- 可以取最后 \(k\) 位模 \(n\) 来表示整个数模 \(n\) 的结果,也就说明去除最后 \(k\) 位(这里指将后 \(k\) 位均变为 \(0\)),形成的数一定是 \(n\) 的倍数。也就是:
\[d_{m} \times b^{m} + ... + d_{k + 1} \times b^{k + 1} + d_{k} \times b^{k} \equiv 0 (mod \space n)
\]
上述 \(d_{i}\) 是任意取值的。因此要想等式恒成立,则一定有:
\[b^{k} \equiv 0 (mod\space n)
\]
- 这里以 \(k = 3\) 为例:设该数为 \(b\) 进制表示,共 \(7\) 位。
则将该数用进制拆分可表示为:
\[d_{6}b^{6} + d_{5}b^{5} + d_{4}b^{4} + d_{3}b^{3} + d_{2}b^{2} + d_{1}b^{1} + d_{0}b^{0}
\]
而用该数从低到高每三位的和所表示的数为:
\[d_{0}b^{0} + (d_{2}b^{2} + d_{1}b^{1} + d_{0}b^{0}) + (d_{2}b^{2} + d_{1}b^{1} + d_{0}b^{0})
\]
两式 \(mod \space n\) 相等,若恒成立,则必有:
\[b^{k} \equiv 1 (mod\space n)
\]
- 与2极为类似。只不过第二个式子变为:
\[d_{0}b^{0} - (d_{2}b^{2} + d_{1}b^{1} + d_{0}b^{0}) + (d_{2}b^{2} + d_{1}b^{1} + d_{0}b^{0})
\]
整理一下即为:
\[b^{k} \equiv n - 1 (mod\space n)
\]
证毕。
得到结论后,由于需要从小到大枚举可行解,则还需要考虑一下如何快速判断无解的情况(否则一直得不到可行解,导致死循环)。这里可以利用循环节的技巧:
余数范围在 \([0,n-1]\) 之间,则在 \(k\) 从小变大的过程中,余数为 \(0\) 或 \(1\) 或 \(n - 1\) 中的某一个时,有解;否则,在没有遇到这三个数时,遇到了一个之前得到过的余数,则可以立即判定无解,因为接下来的所有余数将会构成循环节,且永远不会出现 \(0\) 或 \(1\) 或 \(n - 1\)。因此开一个 \(vis\) 数组记录得到过的余数即可,复杂度 \(O(n)\)。
code