K尾相等数问题
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; }