K尾相等数问题
描述
一个自然数K(2≤K),若存在自然数M和N(M大于N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对“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;
}