尾数相等的数Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Total Submission: 45 Submission Accepted: 8Description从键盘输入一个自然数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 }