题目描述:
从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且他们末尾三位数相等,则称M和N是一对“K尾相等数”。编写一程序,输出M+N值最小的K尾相等数。
测试输入数据:
2
测试输出数据:
120
思路:
最开始想错了,蛋疼了很久。仔细思考后,我们可以注意到,任何数对1000求模只有1000种可能(0~999),所以我们将K^Power 中的Power从1到1001逐个求值,总有相等的两个数字。因为结果只有1000种可能,但是有1001次求值,哪怕前1000次所求结果都不一样,最后一次的值必然与前面1000种其中的一种相等。
这里我用mark数组保存上一次后三位是这个值时应该是几次方,只要扫描发现它不是0就可以判断出现了重复。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t,k,i,j;
int mark[1010];
scanf("%d",&t);
while(t--)
{
scanf("%d",&k);
int temp=k;
memset(mark,0,sizeof(mark));
if(k%1000==0)
printf("3\n");
else
{
int ok=0;
if(k>1000)
{
k=k%1000;
ok=1;
}
int temp=1;
for(i=1;i<=1001;i++)//第几次方
{
temp*=k;
if(temp<1000&&ok==0)
continue;
ok=1;
temp=temp%1000;
if(mark[temp])
{
printf("%d\n",mark[temp]+i);
break;
}
mark[temp]=i;//mark数组保存上次后三位是temp时它是k的几次方
}
}
}
return 0;
}