Educational Codeforces Round 173 B.Digits 数的可除性法则
Codeforces 题解 - [Educational Codeforces Round 173 B.Digits]
题目描述
Artem 在黑板上连续写下数字 d ,恰好是 n! 次。因此,他得到的数是 dddddd…ddd (恰好是 n! 位)。
现在他很好奇,从 1 到 9 中的哪些奇数数字可以除以黑板上写的数字。
输入格式
输入
第一行包含一个整数 \(t\) ( \(1 \le t \le 100\) ) — 测试用例的数量。接下来是 \(t\) 个测试用例。
每个测试用例由一行组成,其中包含两个整数 \(n\) 和 \(d\) ( \(2 \le n \le 10^9\) , \(1 \le d \le 9\) )。
输出格式
输出
对于每个测试用例,输出 1 到 9 中能整除该数字的所有奇数,按升序输出。
题目大意
题目给定了一个形如 dddd...d 的数字,长度为 n!,我们需要判断哪些奇数(1, 3, 5, 7, 9)能够整除这个数字。
输入
3
2 6
7 1
8 5
输出
1 3
1 3 7 9
1 3 5 7 9
解题思路
解法 1
我们可以将数字表示为 \(C = d \times 111...1\),其中 111...1 是由 \(n!\) 个 1 组成的数字。
对于这种情况,我们可以利用 \(S(n) = 10^0 + 10^1 + 10^2 + ... + 10^{n! - 1}\) 来简化计算。这个数 \(C\) 可以表示为:
\[C = d \times \frac{10^{n!} - 1}{9} \tag{1}
\]
令
\[T=\frac{10^{n!} - 1}{9} \tag{2}
\]
分析C
- 1: 任何数都能被 1 整除,因此答案中始终包含 1。
- 3: 数字的各位和能被 3 整除时,数字能被 3 整除。当 \(n! \ge 3\) 时,\(S(n) \% 3 = 0\),所以 \(C\) 一定能被 3 整除。
- 5: 一个数能被 5 整除,必须以 0 或 5 结尾。但由于 \(S(n)\) 的形式决定了其末尾不能是 0 或 5,因此 \(S(n)\) 绝不可能被 5 整除。
- 7: \(S(n)\) 模 7 有周期性。当 \(n! \ge 6\) 时,
- \(S(n)\) 一定能被 7 整除。
S(n) = 10^0 + 10^1 + 10^2 + ''' + 10^(n! - 1)
我们能注意到
10\(^0\) ≡ 1 (mod 7)
10\(^1\) ≡ 3 (mod 7)
10\(^2\) ≡ 2 (mod 7)
10\(^3\) ≡ 6 (mod 7)
10\(^4\) ≡ 4 (mod 7)
10\(^5\) ≡ 5 (mod 7)
\(10^6 ≡ 1 (mod 7)\)
可知周期为6
\[10^k ≡ 10^{k\%6} \pmod{7} \tag{3} \]10的任何倍六次方的模7结果 都是1\[10^{6k} \equiv 1 \pmod{7} \tag{4} \]即\[10^{6k} - 1 \equiv 0 \pmod{7} \tag{5} \]当\(n! \geq 6\) 时,此时n!,一定包含6的倍数1*2*3···n!,即\(n\geq3\)时\[10^{n!} - 1 ≡ 0 \pmod{7} \tag{6} \]说明 10\(^{n!}\) - 1 是 7的倍数
接下来考虑分母9.因为9和7互质,
∴\(\frac{10^{n!} - 1}{9}\) 能被7整除的条件就是 10\(^{n!}\) - 1本身就是7的倍数
∴当n!包含6的倍数的时即n>=3时,我们可以得出
\(\frac{10^{n!} - 1}{9}\) ≡ 0 (mod 7)- 9: \(S(n)\) 的数字根是 9 时,\(S(n)\) 能被 9 整除。当 \(n! \ge 6\) 时,\(S(n)\) 必定是 9 的倍数。
- 什么是数字根
分析d
易得 d % i = 0, i ∈ {1, 3, 5, 7, 9}可以被i整除.
通过分析,我们可以总结出以下规则:
- 1 一定能被整除。
- 3 在 \(n \ge 3\) \(\lor\) \(d = 3\) 时一定能被整除。
- 7 在 \(n \ge 3\) \(\lor\) \(d = 7\)时一定能被整除。
- 9 在 \(n \ge 6\) \(\lor\) \((n \geq 3 \land d = 3)\) \(\lor\) \(d = 9\)时一定能被整除。
- 5 只能在 \(d = 5\) 时能整除。
- 很明显时间复杂度是O(1).
代码实现
#include "bits/stdc++.h"
using namespace std;
void Solution() {
int n, d;
cin >> n >> d;
set<int> Ans = {1}; // 1 一定能整除
// 5 只能在 d = 5 时能整除
if (d == 5) Ans.insert(5);
// 3 当 n >= 3 时一定能整除
if (d % 3 == 0 || n >= 3) Ans.insert(3);
// 7 当 n >= 3 时一定能整除
if (d % 7 == 0 || n >= 3)
{
Ans.insert(7);
}
// 9 当 n >= 6 时一定能整除
if (d % 9 == 0 || n >= 6 || (n >= 3 && d % 3 == 0))
{
Ans.insert(9);
}
// 输出结果
for (auto& x : Ans) cout << x << ' ';
cout << '\n';
}
int main() {
int t;
cin >> t;
while (t--) {
Solution();
}
return 0;
}

浙公网安备 33010602011771号