nyoj_212_K尾相等数_210402272239

 

K尾相等数

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
 
描述
输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。
 
输入
第一行包含一个正整数T,T<10000,表示有T组数据; 随后有N行,每行包括一个整数K(K<2*10^10);
输出
对于输入的每个整数K,输出对应的M+N的最小值;
样例输入
1
2
样例输出
120
来源
POJ
上传者
王冲5213
解题思路:每次相乘后都取余,以余数为索引将指数存到数组中,若余数相同的存在,则直接返回当前指数与对应数组元素的和。经典题。
(之前的想法是新得到的数再与前面的逐一比较,比较麻烦比较费时,参考别人的做法,是直接以得到的数为下标存入数组,再与之比较的时候直接就比较了,省时省事)
代码如下:
#include <stdio.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int s[1010]={0};
        int i,j,k,t,m;
        scanf("%d",&k);
        t=1;m=0;
        while(t<1000)
        {
            t*=k;
            m++;
        }
        t=t%1000;
        s[t]=m;
        k=k%1000;
        while(1)
        {
            t*=k;
            t=t%1000;
            m++;
            if(s[t])
            {
                printf("%d ",m+s[t]);
                break;
            }
            else
            s[t]=m;
        }
    }
    return 0;
}
 1 #include <stdio.h>
 2 int main()
 3 {
 4     int T;
 5     scanf("%d",&T);
 6     while(T--)
 7     {
 8         int s[1010]={0};
 9         int i,j,k,t,m;
10         scanf("%d",&k);
11         t=1;m=0;
12         while(t<1000)
13         {
14             t*=k;
15             m++;
16         }
17         t=t%1000;
18         s[t]=m;
19         k=k%1000;
20         while(1)
21         {
22             t*=k;
23             t=t%1000;
24             m++;
25             if(s[t])
26             {
27                 printf("%d
",m+s[t]);
28                 break;
29             }
30             else
31             s[t]=m;
32         }
33     }
34     return 0;
35 }
View Code
原文地址:https://www.cnblogs.com/xl1027515989/p/3572585.html