pat 갑급 1010.Radix (25)

1010. Radix (25)
시간 제한
400 ms
메모리 제한
65536 kB
코드 길이 제한
16000 B
판정 절차
Standard
작자
CHEN, Yue
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a binary number.
Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.
Input Specification:
Each input file contains one test case. Each case occupies a line which contains 4 positive integers: N1 N2 tag radix Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number "radix"is the radix of N1 if "tag"is 1, or of N2 if "tag"is 2.
Output Specification:
For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print "Impossible". If the solution is not unique, output the smallest possible radix.
Sample Input 1:
6 110 1 10

Sample Output 1:
2

Sample Input 2:
1 ab 1 2

Sample Output 2:
Impossible
주제 분석:
1. 이분진법을 고려하여 이 진법 아래의 숫자의 크기를 비교한다. 범위는 [B 각 비트의 최대치, A의 값]
2. 만약에 B가 한 명만 있다면 B가 A인지 아닌지를 판단하는 것이다. 한 걸음이면 된다. 범위는 [B 각 위치의 최대치, A의 값]
1) A의 값은 B와 같고 분명히 가능하다. 그러면 범위 내에서 사실은 하나의 수로 이분 프로그램을 가져간다.
2) A의 값은 B와 다르다. 크기를 막론하고 Impossible이다. 이분 프로그램을 가져와서 비교할 때마다 일치하지 않는다.
AC 코드는 다음과 같습니다.
#include
#include
#include
using namespace std;
map<char,long long>mm;
long long getlow(char n[])
{
        long long maxx=-1;
        for(long long i=0;iif(maxxreturn maxx+1;
}
long long getx(char n[],long long radix)
{
        long long sum=0;
        for(long long i=0;ireturn sum;
}
long long compare(char n[],long long x,long long radix)
{
        long long sum=0;
        for(long long i=0;iif(sum>x)
                        return 1;
        }
        if(sum == x)
                return 0;
        if(sum < x)
                return -1;
}
long long getresult(long long low,long long high,char n[],long long x)
{
        long long mid=low;
        while(low<=high)
        {
                long long b=compare(n,x,mid);
                if(b==0)
                        return mid;
                else if(b==1)
                        high=mid-1;
                else if(b==-1)
                        low=mid+1;
                mid=(low+high)/2;
        }
        return -1;
}
int main()
{
        long long i;
        for(i='0';i<='9';i++)
                mm[i]=i-'0';
        for(i = 'a' ; i <='z' ; i++)
                mm[i] = 10 + i - 'a';
        char n1[21];
        char n2[21];
        char ctem[21];
        long long tag;
        long long radix;
        scanf("%s%s%lld%lld",n1,n2,&tag,&radix);
        if(tag == 2)
        {
                strcpy(ctem,n2);
                strcpy(n2,n1);
                strcpy(n1,ctem);
        }
        long long x = getx(n1,radix);
        long long low = getlow(n2);
        long long high = x + 1;
        long long result = getresult(low,high,n2,x);
        if(result == -1)
                printf("Impossible
"
); else printf("%lld
"
,result); return 0; }

좋은 웹페이지 즐겨찾기