Codeforces 题解 - [Educational Codeforces Round 173 B.Digits]
题目链接
题目大意
n! 个 d 组成的形如 dd ''' d (n! 个)
求能被1-9中哪些奇数整除
每个用例按升序输出
输入
3
2 6
7 1
8 5
输出
1 3
1 3 7 9
1 3 5 7 9
解题思路
解法1
这个数可以看作 C = d * 1111'''1(n!个)
注意到后面的数的形式 S(n) = 10$^0$ + 10$^1$ + 10$^2$ + 10$^3$ + ... + 10$^{n! - 1}$
等比数列求和得到
S(n) = (10$n!$ - 1)⁄9
只讨论S(n)
- 1 1始终是答案,任何书都可以被1整除
- 3 一个数所有位数之和能被3整除它就是3的倍数,那么当n!的大于等于3,即n >= 3时,S(n) % 3 = 0,即C一定是3的倍数
- 5 一个非负整数个位是0或5,才可以是5的倍数,因此S(n) 绝不是5的倍数
- 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 mod 6}$ (mod 7)
10的任何倍六次方的模7结果 都是1
10$^{(6k\mod\6)}$ ≡ 1 (mod 7)
当n! 是6的倍数时
10$^{n!}$ - 1 ≡ 0 (mod 7)
说明 10$^{n!}$ - 1 是 7的倍数
接下来考虑分母9.我们知道,9和7互质,
∴(10$n!$ - 1)⁄9 能被7整除的条件就是 10$^{n!}$ - 1本身就是7的倍数
∴当n!包含6的倍数的时即n>=3时,我们可以得出
(10$n!$ - 1)⁄9 ≡ 0 (mod 7)
- 9 当S(n)的数字根为9时,S(n) 能被9整除
设S(n) = 10$^0$ + 10$^1$ + 10$^2$ + ''' + 10$^{n! - 1}$
什么是数字根
更简单的来说就是每一位的和相加是9的倍数,这个数就是9的倍数
因此当n! >= 6(因为此时有3 和 6,即一定是9的倍数个1),即n >= 6
时,S(n) 一定是9的倍数。
接下来考虑d,如果d%i == 0, i∈{x|x∈{1,3,5,7,9}},那么d*S(n) 一定是i的倍数。
还有一个特殊情况就是d % 3 == 0 && S(n) % 3 == 0, C也是9的倍数。
至此所有情况考虑完毕
附上代码
#include "bits/stdc++.h"
using namespace std;
// #define int int64_tvoid Solution()
{int n, d;cin >> n >> d;//1set<int> Ans = {1};//5if (d == 5) Ans.insert(5);//3 数位之和是3的倍数if (d % 3 == 0 || n >= 3) Ans.insert(3);//7if (d % 7 == 0 || n >= 3){Ans.insert(7);}else if (n < 3){int factorialN = 1;for (int i = 2; i <= n; ++i){factorialN *= i;}if ((int)pow(10, factorialN) % 7 == 0)Ans.insert(7);}//9if (d % 9 == 0 || n >= 6 || n >= 3 && d % 3 == 0){Ans.insert(9);}for (auto& x : Ans) cout << x << ' '; cout << '\n';return;
}signed main()
{int t;cin >> t;while(t--){Solution();}return 0;
}
解法2 暂且不论
代码实现
#include <bits/stdc++.h>
using namespace std;int main()
{return 0;
}