您的位置:首页 > 其它

【ACM】K尾相等数

2016-05-18 16:03 246 查看
问题描述:

从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M 和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对”K尾相等数”。请编写程序,输出M+N最小的K尾相等数。

样例:

输入输出
2120
问题分析:

末尾三位数只有1000个,从1到无穷大增大幂次时,肯定会出现同样的末尾三位数,比如n=10时(n^M大于1000时才有末尾三位数),

幂次M12345
n^M10100100010000100000
末尾三位数000
所以当幂次为3时出现了第一个三位数,当幂次为4时出现了第二个三位数,N = 3,M = 4,且M+N最小。所以只要最先两次出现在同一个三位数框里的两个幂次就是我们所求的M和N。

代码如下:

#include <iostream>
using namespace std;

int main(){
int n;
while(cin>>n) {
int arr[1000]={
0
};
bool b = false;
if(n>=1000) {
b = true;
n=n%1000;
}
int c = 0;
int k = 1;
while(true){
c+=1;
k*=n;
if(k>=1000 || b == true) {
k=k%1000;
if(arr[k]==0) {
arr[k]= c;
} else {
break;
}
}

}
cout<<(c+arr[k])<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: