题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等。不存在的话,则输出Impossible

这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的。

有两个注意点
1.我被题目给骗了!!!以为最大进制只可能是36,所以在程序里就枚举2~36的进制,导致错了一大片样例
最小进制下界low当然是n2的最大数字位+1
最大进制上界high题目没有给出说明,但最大只可能为n1(前提n1>=low)。
为啥不会超过n1呢,比如
40 10 1 10
很明显10是进制表示除“个位”外最小的了,那么只有当进制为40时,它才等于n1,如果进制再大,就肯定大于n1了。

2.如果从low枚举到high,当high很大的时候,会很费时间,题目也设了一个样例会让你超时。
所以这里需要二分搜索二进制k

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
using namespace std;
char n1[],n2[];
int t,r;
long long tmp; /*
val2为n2在k进制下的值
val2<target,return -1
val2==target,return 0
val2>target,return 1
*/
int cmp(long long*a,long long k,long long target,int len){
long long val2=;
for(int i=;i<len;i++)
val2=val2*k+a[i];
//val2可能存在溢出的问题,这里要注意。
if(val2< || val2>target)
return ;
if(val2<target)
return -;
if(val2==target)
return ;
}
//二分搜索进制k
long long binarySearch(long long *a,long long low,long long high,long long target,int len){
long long l=low,r=high;
long long mid;
while(l<=r){
mid=(l+r)/;
if(cmp(a,mid,target,len)==)
return mid;
if(cmp(a,mid,target,len)<){
l=mid+;
}
else{
r=mid-;
}
}
return -; //impossible
}
int main()
{
scanf("%s %s %d %d",n1,n2,&t,&r);
if(t==){
swap(n1,n2); //交换一下,方便后面处理
}
char num[];
strcpy(num,n1);
int len=strlen(num);
long long val1=; //转化成十进制
for(int i=;i<len;i++){
if(''<=num[i] && num[i]<='')
tmp=num[i]-'';
else if('a'<=num[i] && num[i]<='z')
tmp=num[i]-'a'+;
val1=val1*r+tmp;
}
strcpy(num,n2);
len=strlen(num);
long long low=;
long long a[]; //将n2的字符表示转化成数组存储
for(int i=;i<len;i++){
if(''<=num[i] && num[i]<='')
tmp=num[i]-'';
else if('a'<=num[i] && num[i]<='z')
tmp=num[i]-'a'+;
a[i]=tmp;
if(tmp>low)
low=tmp;
}
low=low+;
long long high=max(low,val1)+;
long long ans=binarySearch(a,low,high,val1,len);
if(ans==-)
printf("Impossible\n");
else
printf("%lld\n",ans);
return ;
}

PAT甲题题解-1010. Radix (25)-二分搜索的更多相关文章

  1. PAT甲题题解-1032. Sharing (25)-链表水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  2. PAT甲题题解-1003. Emergency (25)-最短路径+路径数目

    给出n个城市,m条边,起始点c1和目的点c2接下来给出n个城市的队伍数以及m条双向边问你求c1到c2的所有最短路径数目,以及其中经过的最多队伍数 先最短路dijkstra,同时建立vector数组pr ...

  3. PAT甲题题解-1029. Median (25)-求两序列的中位数,题目更新了之后不水了

    这个是原先AC的代码,但是目前最后一个样例会超内存,也就是开不了两个数组来保存两个序列了,意味着我们只能开一个数组来存,这就需要利用到两个数组都有序的性质了. #include <iostrea ...

  4. PAT甲题题解-1070. Mooncake (25)-排序,大水题

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  5. PAT甲题题解-1078. Hashing (25)-hash散列

    二次方探测解决冲突一开始理解错了,难怪一直WA.先寻找key%TSize的index处,如果冲突,那么依此寻找(key+j*j)%TSize的位置,j=1~TSize-1如果都没有空位,则输出'-' ...

  6. PAT甲题题解-1006. Sign In and Sign Out (25)-找最小最大

    判断哪个人最早到,哪个人最晚走水,就是找最大值最小值 #include <iostream> #include <cstdio> #include <algorithm& ...

  7. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  8. PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟

    模拟先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站0 1 2 3 4 5 6 7 87.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 00 150 200 300 4 ...

  9. PAT甲题题解-1036. Boys vs Girls (25)-找最大最小,大水题

    题意:给出n个人的姓名.性别.ID.分数,让你找出其中哪个妹纸分数最高.哪个汉子分数最低.以及他们的差如果没有妹纸或者汉子,则对应输出Absent,差用NA代替. 就是for一遍找最大最小值,水题 # ...

随机推荐

  1. Windows2008 Server r2 64位显示桌面图标的方法

    点击桌面左下方的开始菜单,在搜索框中输入“icon”,如下图所示: 点击:显示或隐藏桌面上的通用图标,然后弹出如下图: 应用并确定即可!

  2. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  3. python第三十六课——1.可迭代对象

    1.可迭代对象: 满足前提: 只要能被循环操作的对象,就可以可迭代对象 举例: str.list.tuple.set.dict.range.generator... 高效的检测一个对象是否是可迭代对象 ...

  4. java使用纯命令行打包项目

    1: javac -d 编译之后的class文件输出目录   指定源文件位置即可.例如 对于多个包下面的源码编译,貌似javac不支持迭代编译,可能需要一次传入多个源码位置进行编译.一种便捷方法就是使 ...

  5. docker-compose运行Rails

    1.新建空目录,名字可以叫Rails 2.新建Dockerfile并添加如下内容 FROM ruby:2.5 RUN apt-get update -qq && apt-get ins ...

  6. shiro实战系列(十一)之Caching

    Shiro 开发团队明白在许多应用程序中性能是至关重要的.Caching 是从第一天开始第一个建立在 Shiro 中的一流功 能,以确保安全操作保持尽可能的快.   然而,Caching 作为一个概念 ...

  7. 解决The SDK platform-tools version ((23)) is too old to check APIs compiled with API 23

    用2.0的Android Studio  bate版 打开项目,在包名的地方会出现一条红线,但是似乎不影响代码的正确性. 看着好不爽啊,我倒是还没运行就找办法解决掉了.就是说是否影响程序正常运行我是不 ...

  8. $Luogu P2029$ 跳舞 题解

    一道不是十分水的\(dp\). 首先我们考虑\(dp\)方程的构造.起初我定义的状态是\(dp_{i,j}\)表示前\(i\)个格子,总共跳了\(j\)次的最大得分.但事实上它并不可以转移,因为我们不 ...

  9. 3D Touch开发技巧的笔记

    iPhone6s以及iPhone6s plus搭载iOS9,有一个新功能叫做3D Touch,这个功能有很大的用处,关键是要会用,这给交互方式又多了一个新的选择和思考,比如说游戏中的额外控制选项.绘图 ...

  10. 从源代码解释Android事件分发机制

    在ViewRootImpl的setView方法中.用户的触摸按键消息是体如今窗体上的.而windowManagerService则是管理这些窗体,它一旦接收到用户对窗体的一些触摸按键消息,会进行对应的 ...