最幸运的数字
最幸运的数字
是中国的幸运数字,如果一个数字的每一位都由 构成则该数字被称作是幸运数字。
现在给定一个正整数 ,请问至少多少个 连在一起组成的正整数(即最小幸运数字)是 的倍数。
输入格式
输入包含多组测试用例。
每组测试用例占一行,包含一个整数 。
当输入用例 时,表示输入终止,该用例无需处理。
输出格式
每组测试用例输出结果占一行。
结果为 Case i: +一个整数 , 代表满足条件的最小幸运数字的位数。
如果满足条件的幸运数字不存在,则 。
数据范围
输入样例:
8 11 16 0
输出样例:
Case 1: 1 Case 2: 2 Case 3: 0
解题思路
假设最小位数为,那么
因此问题由求最小的满足等价变成了求最小的满足。
对于,由欧拉定理,如果则,如果那么无解(可以由裴蜀定理来证明),否则必然有解可以取。但题目要求最小的,虽然满足这个同余式但不一定是最小的。
实际上还有一个结论:所有满足同余方程的最小的正整数一定满足。因此可以对进行约数分解,把所有约数带到这个同余式找到满足方程的最小的约数。
更一般的,可以换成任意与互质的数,那么所有满足同余方程的最小的正整数一定满足。
下面证明这个结论。假设是满足同余方程的最小值且,那么一定可以表示成 。由于,因此,所以
因此这样就找到一个新的 使得,且比更小,就矛盾了。
总结一下这题的流程步骤,先求出,然后判断和是否互质,如果不互质那就无解。否则求出,对分解约数并通过快速幂求满足的最小约数。
还有一个地方需要注意的是,由于最大可以取到(大概),因此在快速幂中两个数相乘是可能爆的,因此还要写个龟速乘来求两个数的乘积。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 6 LL gcd(LL a, LL b) { 7 return b ? gcd(b, a % b) : a; 8 } 9 10 LL phi(LL x) { 11 LL ret = x; 12 for (int i = 2; i <= x / i; i++) { 13 if (x % i == 0) { 14 ret -= ret / i; 15 while (x % i == 0) { 16 x /= i; 17 } 18 } 19 } 20 if (x > 1) ret -= ret / x; 21 return ret; 22 } 23 24 LL qmul(LL a, LL k, LL p) { 25 LL ret = 0; 26 while (k) { 27 if (k & 1) ret = (ret + a) % p; 28 a = (a + a) % p; 29 k >>= 1; 30 } 31 return ret; 32 } 33 34 LL qmi(LL a, LL k, LL p) { 35 LL ret = 1; 36 while (k) { 37 if (k & 1) ret = qmul(ret, a, p); // ret*a可能会爆long long,因此用龟速乘 38 a = qmul(a, a, p); // 同理 39 k >>= 1; 40 } 41 return ret; 42 } 43 44 int main() { 45 int tot = 1; 46 LL l; 47 while (scanf("%lld", &l), l) { 48 LL c = 9 * l / gcd(9 * l, 8), ret = 1e18; 49 if (gcd(10, c) != 1) { // 10和c不互质,无解 50 ret = 0; 51 } 52 else { 53 LL phi_c = phi(c); 54 for (int i = 1; i <= phi_c / i; i++) { // 分解phi(c)的约数 55 if (phi_c % i == 0) { 56 if (qmi(10, i, c) == 1) ret = min(ret, (LL)i); // 约数满足同余式则求最小的约数 57 if (qmi(10, phi_c / i, c) == 1) ret = min(ret, phi_c / i); // 另外一个约数 58 } 59 } 60 } 61 printf("Case %d: %lld\n", tot++, ret); 62 } 63 64 return 0; 65 }
参考资料
AcWing 202. 最幸运的数字(算法提高课):https://www.acwing.com/video/705/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17069969.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2022-01-28 圆形牛棚