PAT 1010
1015. Reversible Primes (20)
A reversible prime in any number system is a prime whose "reverse" in that number system is also a prime. For example in the decimal system 73 is a reversible prime because its reverse 37 is also a prime.
Now given any two positive integers N (< 105) and D (1 < D <= 10), you are supposed to tell if N is a reversible prime with radix D.
Input Specification:
The input file consists of several test cases. Each case occupies a line which contains two integers N and D. The input is finished by a negative N.
Output Specification:
For each test case, print in one line "Yes" if N is a reversible prime with radix D, or "No" if not.
Sample Input:73 10 23 2 23 10 -2Sample Output:
Yes Yes No
代码:
1 //============================================================================ 2 // Name : PAT.cpp 3 // Author : wenlong 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C++, Ansi-style 7 //============================================================================ 8 9 #include <iostream> 10 #include <vector> 11 #include <cstdio> 12 #include <cstring> 13 using namespace std; 14 15 bool debug = true; 16 long long least = 0, most = 0; 17 18 int getV(char v) { 19 if (v >= '0' && v <= '9') { 20 return v - '0'; 21 } else if (v >= 'a' && v <= 'z') { 22 return v - 'a' + 10; 23 } 24 25 return 0; 26 } 27 28 long long findLowRadix(char *p) { 29 int len = strlen(p); 30 long long low = 0; 31 long long num; 32 for (int i = 0; i < len; i++) { 33 num = getV(p[i]); 34 if (num + 1 > low) { 35 low = num + 1; 36 } 37 } 38 return low; 39 } 40 41 long long getVV(char *d, long long a) { 42 int i = 0; 43 long long res = 0; 44 while (d[i] != '\0') { 45 res = res * a + getV(d[i]); 46 i++; 47 } 48 49 return res; 50 } 51 52 int compare(char* p, long long radix, long long target) { 53 long long len = strlen(p); 54 long long num = 1; 55 long long sum = 0; 56 for (int i = 0; i < len; i++) { 57 num = getV(p[i]); 58 sum = sum * radix + num; 59 if (sum > target) { //avoid overflow 60 return 1; 61 } 62 } 63 if (sum > target) { 64 return 1; 65 } else if (sum < target) { 66 return -1; 67 } else { 68 return 0; 69 } 70 } 71 72 long long binarySearch(char *p, long long low, long long high, long long top) { 73 long long mid = low; 74 long long tmp; 75 while (low <= high) { 76 tmp = compare(p, mid, top); 77 if (tmp > 0) { 78 high = mid - 1; 79 } else if (tmp < 0) { 80 low = mid + 1; 81 } else { 82 return mid; 83 } 84 mid = (low + high) / 2; 85 } 86 return -1; 87 } 88 89 int main() { 90 91 debug = false; 92 93 int tag; 94 long long value, radix; 95 96 char n1[11], n2[11]; 97 98 cin >> n1 >> n2 >> tag >> radix; 99 100 int i = 0; 101 value = 0; 102 char *datas = NULL; 103 if (tag == 1) { 104 value = getVV(n1, radix); 105 datas = n2; 106 } else { 107 value = getVV(n2, radix); 108 datas = n1; 109 } 110 111 least = findLowRadix(datas); 112 most = (value + 1 > least + 1) ? value + 1 : least + 1; 113 114 long long res = binarySearch(datas, least, most, value); 115 116 if (res == -1) { 117 cout << "Impossible" << endl; 118 } else { 119 cout << res << endl; 120 } 121 122 return 0; 123 }