雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

穷举+二分——PAT1010

Posted on 2013-05-10 16:35  huhuuu  阅读(347)  评论(0编辑  收藏  举报

给出两个数,已知一个数的进制,求是否可以在某进制下两数相等。 

此题有个坑,进制在35以内,但是求的进制是远大于35

穷举法可以过大部分数据,第7个数据不能过,所以就先穷举,特殊值在二分

View Code
#include<stdio.h>
#include<iostream>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;

int main()
{
    char s1[19],s2[19],st[19];
    int tag,radix,max=0;


    scanf("%s",s1);
    scanf("%s",s2);
    scanf("%d%d",&tag,&radix);

    if(tag==2){
        strcpy(st,s1);
        strcpy(s1,s2);
        strcpy(s2,st);
    }
    long long i,add1,add2,k,temp;
    long long all1=0,all2=0;
    for(i=0;s1[i];i++);add1=i;
    for(i=0;s2[i];i++){
        if(s2[i]<='9')temp=s2[i]-'0';
        else temp=s2[i]-'a'+10;
        if(max<temp)max=temp;
    }add2=i;

    for(i=add1-1;i>=0;i--){
        if(s1[i]<='9'){
            all1+=(s1[i]-'0')*(long long)pow(1.0*radix,1.0*(add1-i-1));
        }
        else{
            all1+=(s1[i]-'a'+10)*(long long)pow(1.0*radix,1.0*(add1-i-1));
        }
    }

    //  printf("%lld",all1);
    for(k=max+1;k<=1000000;k++){
        all2=0;
        for(i=add2-1;i>=0;i--){
            if(s2[i]<='9'){
                all2+=(s2[i]-'0')*(long long)pow(1.0*k,1.0*(add2-i-1));
                temp=s2[i]-'0';
            }
            else{
                all2+=(s2[i]-'a'+10)*(long long)pow(1.0*k,1.0*(add2-i-1));
                temp=s2[i]-'a'+10;
            }
        }
        if(all2<0){//溢出的时候特殊处理
            printf("Impossible\n");
            return 0;
        }
        if(all1==all2)break;
    }


    if((k<=1000000)&&(all1==all2))
        printf("%d\n",k);
    else
    {
        long long ll=1000000,mid,rr=10000000000;
        while(ll<=rr)//特殊数据特殊处理2分
        {
            k=(ll+rr)/2;
            all2=0;
            for(i=add2-1;i>=0;i--){
                if(s2[i]<='9'){
                    all2+=(s2[i]-'0')*(int)pow(1.0*k,1.0*(add2-i-1));
                    temp=s2[i]-'0';
                }
                else{
                    all2+=(s2[i]-'a'+10)*(int)pow(1.0*k,1.0*(add2-i-1));
                    temp=s2[i]-'a'+10;
                }
            }
            
            if(all1==all2)break;
            if(all2<0)rr=k-1;
            else{
                if(all2>all1)rr=k-1;
                else ll=k+1;
            }
        }
        
        if(all1==all2)
            printf("%d\n",k);
        else 
        printf("Impossible\n");
    }

    return 0;
}