AOJ 760.尾数相等的数

尾数相等的数
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 45   Submission Accepted: 8
 
Description
从键盘输入一个自然数K(1 < K < 99999999),一定存在自然数M和N(M < N),使得K的M次方和K的N次方均大于或等于1000,且它们的未尾三位数相等,则称M和N是一对“K尾相等数”。请编程序,输出K尾相等数中M+N最小值。

 

Input
每一行包含一组测试数据,每组测试数据包含一个位长小于10的正整数K.

 

Output
对每组测试数据输出一行。每行包含2个正整数M和N,两数之间用一个空格分隔。

 

Sample Input
Original Transformed
20
125

 

Sample Output
Original Transformed
3 4
2 4

 

模拟操作即可,关键在于由于数据较大,而我们需要的只有后三位,因此不断%1000即可

 

注意1次方就符合条件的情况,和小于1000的情况

 

AC代码:GitHub

 1 /*
 2 By:OhYee
 3 Github:OhYee
 4 HomePage:http://www.oyohyee.com
 5 Email:oyohyee@oyohyee.com
 6 Blog:http://www.cnblogs.com/ohyee/
 7  
 8 かしこいかわいい?
 9 エリーチカ!
10 要写出来Хорошо的代码哦~
11 */
12  
13 #include <cstdio>
14 #include <algorithm>
15 #include <cstring>
16 #include <cmath>
17 #include <string>
18 #include <iostream>
19 #include <vector>
20 #include <list>
21 #include <queue>
22 #include <stack>
23 #include <map>
24 using namespace std;
25  
26 //DEBUG MODE
27 #define debug 0
28  
29 //循环
30 #define REP(n) for(int o=0;o<n;o++)
31  
32 //初始化
33 #define mst(a) memset(a,-1,sizeof(a))
34  
35 const int maxn = 1005;
36 int visited[maxn];
37  
38 bool Do() {
39     long long n;
40     if(scanf("%lld",&n) == EOF)
41         return false;
42  
43     mst(visited);
44  
45     int N,M,e = 1;
46     long long k = n;
47     while(k < 1000) {
48         k *= n;
49         e++;
50     }
51     k %= 1000;
52     for(int i = 0;;i++) {
53         if(visited[k] != -1) {
54             N = e + i;
55             M = visited[k];
56             break;
57         } else {
58             visited[k] = e + i;
59         }
60         k *= n;
61         k %= 1000;
62     }
63  
64     printf("%d %d\n",M,N);
65  
66     return true;
67 }
68  
69 int main() {
70     while(Do());
71     return 0;
72 }

 

posted @ 2016-05-21 00:35  OhYee  阅读(165)  评论(0编辑  收藏  举报