Loading web-font TeX/Math/Italic

Educational Codeforces Round 173 B.Digits 数的可除性法则

Codeforces 题解 - [Educational Codeforces Round 173 B.Digits]

题目链接

题目描述

Artem 在黑板上连续写下数字 d ,恰好是 n! 次。因此,他得到的数是 dddddd…ddd (恰好是 n! 位)。

现在他很好奇,从 1 到 9 中的哪些奇数数字可以除以黑板上写的数字。

输入格式

输入

第一行包含一个整数 t ( 1t100 ) — 测试用例的数量。接下来是 t 个测试用例。

每个测试用例由一行组成,其中包含两个整数 nd ( 2n109 , 1d9 )。

输出格式

输出

对于每个测试用例,输出 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×111...1,其中 111...1 是由 n! 个 1 组成的数字。

对于这种情况,我们可以利用 S(n)=100+101+102+...+10n!1 来简化计算。这个数 C 可以表示为:

C=d×10n!19

T=10n!19

分析C

  • 1: 任何数都能被 1 整除,因此答案中始终包含 1。
    • 3: 数字的各位和能被 3 整除时,数字能被 3 整除。当 n!3 时,S(n)%3=0,所以 C 一定能被 3 整除。
    • 5: 一个数能被 5 整除,必须以 0 或 5 结尾。但由于 S(n) 的形式决定了其末尾不能是 0 或 5,因此 S(n) 绝不可能被 5 整除。
    • 7: S(n) 模 7 有周期性。当 n!6 时,
    • S(n) 一定能被 7 整除。
      S(n) = 10^0 + 10^1 + 10^2 + ''' + 10^(n! - 1)
      我们能注意到
      100 ≡ 1 (mod 7)
      101 ≡ 3 (mod 7)
      102 ≡ 2 (mod 7)
      103 ≡ 6 (mod 7)
      104 ≡ 4 (mod 7)
      105 ≡ 5 (mod 7)
      1061(mod7)
      可知周期为6

    10k10k%6(mod7)

    10的任何倍六次方的模7结果 都是1

    106k1(mod7)

    106k10(mod7)

    n!6 时,此时n!,一定包含6的倍数1*2*3···n!,即n3

    10n!10(mod7)

    说明 10n! - 1 是 7的倍数
    接下来考虑分母9.因为9和7互质,
    10n!19 能被7整除的条件就是 10n! - 1本身就是7的倍数
    ∴当n!包含6的倍数的时即n>=3时,我们可以得出
    10n!19 ≡ 0 (mod 7)
    • 9: S(n) 的数字根是 9 时,S(n) 能被 9 整除。当 n!6 时,S(n) 必定是 9 的倍数。
    • 什么是数字根

分析d

易得 d % i = 0, i ∈ {1, 3, 5, 7, 9}可以被i整除.

通过分析,我们可以总结出以下规则:

  • 1 一定能被整除。
  • 3n3 d=3 时一定能被整除。
  • 7n3 d=7时一定能被整除。
  • 9n6 (n3d3) 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;
}
posted @   MatinalCosmos  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示