K尾相等数(模运算)

Description

从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得KM和KN均大于或等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。请编一个程序,输出M+N值最小的K尾相等数。

Input

输入一个整数K

Output

输出M+N的最小值

Sample Input

2

Sample Output

120

用到的知识点:

取模运算

\((a * b) \% mod = ((a \% mod) * (b \% mod)) \% mod\)

K尾相等数

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int k, nums[1000];      // nums[(k^n) % 1000的余数] = n
    while (cin >> k)
    {
        if (k <= 1)
            return -1;
        memset(nums, 0, sizeof(nums));      // nums数组初始化0
        int n = 0, numPow = 1;              // 当前计数的幂次
        while (numPow < 1000)               // 找到>=1000时的k的n次幂
        {
            numPow *= k;
            n++;
        }
        while (true)
        {
            if (nums[numPow % 1000] == 0)
                nums[numPow % 1000] = n;    // 如果nums[]为0, 没有标记过, 就标记当前的幂次数n
            else
                break;              // 被标记过就是, 找到了第二个(M)标记的了
            numPow = (numPow % 1000) * (k % 1000);  // 模运算的乘法
            n++;    // 幂次++
        }
        cout << nums[numPow % 1000] + n << endl;    // nums[numPow % 1000]存的第一次(N)的, n为第二次(M)的
    }
    return 0;
}
posted @ 2020-11-21 22:56  yanhua-tj  阅读(243)  评论(0编辑  收藏  举报