PAT 1010

1015. Reversible Primes (20)

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
-2
Sample 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 }

posted on 2012-11-29 17:56  DerDeath  阅读(164)  评论(0编辑  收藏  举报

导航

"); }); },1000); });