PAT 1010

  1 #include <cstdio>
2 #include <iostream>
3 #include <iomanip>
4 #include <vector>
5 #include <string>
6
7 using namespace std;
8
9 char A[11];
10 char B[11];
11 long long least;
12
13 long long num2Dec(char * p,long long radix)
14 {
15 long long len=strlen(p);
16 long long m = 1;
17 long long num = 1;
18 long long sum = 0;
19 for(long long i=len-1;i>=0;i--)
20 {
21 if(p[i]>='a'&&p[i]<='z')
22 num= p[i] - 'a' + 10;
23 else if(p[i]>='0'&& p[i]<='9')
24 num=p[i] - '0';
25 sum+=num*m;
26 m*=radix;
27 }
28 return sum;
29 }
30
31 long long findLowRadix(char *p)
32 {
33 long long len=strlen(p);
34 long long low=0;
35 long long num;
36 for(long long i=len-1;i>=0;i--)
37 {
38 if(p[i]>='a'&&p[i]<='z')
39 num= p[i] - 'a' + 10;
40 else if(p[i]>='0'&& p[i]<='9')
41 num=p[i] - '0';
42 if(num+1>low)
43 low=num+1;
44 }
45 return low;
46
47 }
48
49 int compare(char* p,long long radix ,long long target)
50 {
51 long long len=strlen(p);
52 long long m = 1;
53 long long num = 1;
54 long long sum = 0;
55 for(long long i=len-1;i>=0;i--)
56 {
57 if(p[i]>='a'&&p[i]<='z')
58 num= p[i] - 'a' + 10;
59 else if(p[i]>='0'&& p[i]<='9')
60 num=p[i] - '0';
61 sum+=num*m;
62 m*=radix;
63 if(sum>target) //avoid overflow
64 return 1;
65 }
66
67 if(sum>target)
68 return 1;
69 else if(sum<target)
70 return -1;
71 else
72 return 0;
73
74 }
75
76
77 long long binarySearch(char *p,long long low,long long high,long long top)
78 {
79 long long mid = low;
80 long long tmp;
81
82 while(low<=high)
83 {
84 tmp = compare(p,mid,top);
85 if(tmp>0)
86 {
87 high = mid-1;
88 }
89 else if(tmp<0)
90 {
91 low = mid +1;
92 }
93 else
94 return mid;
95 mid = (low + high)/2;
96 }
97
98 return -1;
99 }
100
101
102 int main()
103 {
104 long long tag;
105 long long radix;
106 long long target;
107 long long least; // lowest possible radix
108 long long most; // highest possible radix
109 long long res;
110
111
112 cin>>A;
113 cin>>B;
114 cin>>tag;
115 cin>>radix;
116
117 if(1==tag)
118 {
119 target=num2Dec(A,radix);
120 least = findLowRadix(B);
121 most = (target + 1 > least + 1) ? target +1 :least +1;
122 res = binarySearch(B,least,most,target);
123 if(res==-1)
124 cout<<"Impossible"<<endl;
125 else
126 cout<<res<<endl;
127
128 }
129 else if(2==tag)
130 {
131 target=num2Dec(B,radix);
132 least = findLowRadix(A);
133 most = (target + 1 > least + 1) ? target +1 :least +1;
134 res = binarySearch(A,least,most,target);
135 if(res==-1)
136 cout<<"Impossible"<<endl;
137 else
138 cout<<res<<endl;
139 }
140
141 }

posted on 2012-02-17 23:23  bingwenst  阅读(917)  评论(1编辑  收藏  举报

导航