### 分析
我们需要找到两个自然数 \( M \) 和 \( N \) 使得 \( K^M \) 和 \( K^N \) 的末尾三位数相等,并且 \( M \) 和 \( N \) 的和最小。为了实现这一点,我们可以使用快速幂算法来计算 \( K^M \mod 1000 \) 和 \( K^N \mod 1000 \),并记录每个结果的最小指数。当我们找到两个相同的结果时,我们就可以计算 \( M + N \) 并输出最小的和。
### 伪代码
1. 读取输入的自然数 \( K \)。
2. 初始化一个数组 `tail` 用于记录每个结果的最小指数。
3. 使用快速幂算法计算 \( K^i \mod 1000 \)。
4. 如果结果在 `tail` 数组中已经存在,则输出当前指数和记录的最小指数的和。
5. 如果结果不在 `tail` 数组中,则记录当前指数。
6. 重复步骤3-5直到找到两个相同的结果。
### C++代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int quick(int a, int b, int c) {
int ans = 1;
a = a % c;
while (b) {
if (b & 1) ans = (ans * a) % c;
b >>= 1;
a = (a * a) % c;
}
return ans;
}
int main() {
int k, tail[1000] = {0}, start = 0;
scanf("%d", &k);
for (int i = 1; i < 1000; i *= k)
++start;
for (int i = start;; ++i) {
int ans = quick(k, i, 1000);
if (!tail[ans])
tail[ans] = i;
else {
printf("%d\n", i + tail[ans]);
break;
}
}
return 0;
}
标签:相等,start,1076,int,tail,ans,include,1000
From: https://blog.csdn.net/huang1xiao1sheng/article/details/141143997