K尾相等数问题

来源:互联网 发布:淘宝直通车打击同行 编辑:程序博客网 时间:2024/05/22 16:55

                                                                                                                  K尾相等数问题


描述

一个自然数K2≤K),若存在自然数MNM大于N),使得K^MK^N均大于或等于1000,且它们的末尾三位数相等,则称MN是一对“K尾相等数

输入

输入包含若干个测试用例,每个测试用例占一行,为一个自然数K

输出

对每个测试用例,用一行输出符合要求的最小M+N值。

样例输入

2

样例输出

120


一些测试用例可供参考:

2   120
3   114
4    60
5    12
6    33
7    28
8    108
9    58
10  7

思路来之与这位大神:

http://blog.csdn.net/virtualxmars/article/details/2422836


思路其实就是几个原理,一个是标记,一个是可能的情况。

标识指的就是重复计数原理。

可能的情况指的是就是抽屉原理。

意思就是,我们可以把满足要求的每一种情况都标记起来,而情况的多少就是抽屉原理,他要找的是后三位的比较,那样的话我们可以把所有的情况全存起来。用一个一维数组就可以了。

满足情况的事件总共是,1000种,0~999。我们用一个一维数组存起来。(初始化尤为重要!)

代码如下:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[1000]; int ans(int k){     memset(a,0,sizeof(a));     bool cmp = false;     if(k>=1000)      {          cmp = true;            k=k%1000;       }       int p = 1;     for(int i=1;i<=1000;i++){         p *= k;         if(cmp || p>=1000){             p = p%1000;             if(a[p]==0){                 a[p] = i;             }             else             {                 return i+a[p];             }         }     } }int main(){    int k;    while(scanf("%d",&k)!=EOF){       printf("%d\n",ans(k));    }    return 0;}