一切都与进制有关【USACO 2015 January Contest Bronze】

一切都与进制有关

奶牛贝茜一直在她的牛栏中学习计算机课,最近她在致力于学习不同进制下的数字表示。

回想一下,B 进制数字的数位从右到左依次代表 1,B,B2,B3 等等。

例如,在 10 进制下数位从右到左依次代表 1,10,100 等等。

数字序列 1234,在 10 进制下,实际上表示 1(1000)+2(100)+3(10)+4(1),而在 5 进制下,则表示 1(125)+2(25)+3(5)+4(1),这在 10 进制下等于 194。

贝茜注意到,同一数字序列在越高的进制下,表示的数值也就越大,例如 7 进制下的 1234 大于 6 进制下的 1234。

在 B 进制下写数字时,每个数字的范围可以从 0 到 B−1。

例如,10 进制下的每个数字都在 0∼9 的范围内,而 5 进制下的每个数字都在 0∼4 的范围内。

当然,也存在进制超过 10 的数字,比如计算机科学家经常使用 16 进制表示数字,其中字母 A∼F 表示数值 10∼15。

例如,16 进制下的 BEEF 实际上表示 11(4096)+14(256)+14(16)+15,这在十进制下相加等于 48879。

贝茜对使用超过 10 的进制表示数字很感兴趣。

她选取一个整数 N,并写出其在 X 进制以及 Y 进制下的表示。

有趣的是两种表示都是 3 位数字序列,且每个数字都在 1∼9 的范围内。

不幸的是,贝茜把 N,X,Y 都忘记了!

现在,按顺序给出她写下的两个三位数字,请帮她确定 X 和 Y。

输入格式
第一行包含整数 K,表示共有 K 组测试数据。

每组数据占一行,包含两个三位数字,分别表示 N 在 X 进制以及 Y 进制下的表示。

输出格式
共 K 行,每行输出一组测试数据对应的 X,Y。

保证每组数据都存在唯一解。

数据范围
10≤X,Y≤15000,
1≤K≤100
输入样例:
1
419 792
输出样例:
47 35
样例解释
数字 8892 在 47 进制下表示为 419,在 35 进制下表示为 792。

代码

点击查看代码
#include<iostream>

using namespace std;

int get(int x,int k){
    return x/100*k*k+x/10%10*k+x%10;
}

int main(){
    int k,x,y;
    cin >> k;
    while(k --){
        cin >> x >> y;
        for(int i = 10; i <= 15000; i ++ ){
            int t = get(x,i);
            int l = 10,r = 15000,mid;
            while(l < r){
                mid = (l + r) >> 1;
                if(get(y,mid) >= t)r = mid;
                else l = mid + 1;
            }
            if(get(y,r) == t){
                cout << i << " " << r << '\n';
                break;
            }
        }
    }
}
posted @ 2023-02-27 17:21  Keith-  阅读(77)  评论(0编辑  收藏  举报