A1010 Radix (25分)

本文探讨了如何解决两个正整数在不同基数下相等的问题,通过基数转换算法,实现了从已知数的基数到未知数基数的求解。输入包含两个正整数和其中一个数的基数,输出为使等式成立的另一个数的最小可能基数,或在不可能的情况下输出'Impossible'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 N​1​​ and N​2​​, 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

Solution: 

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

map<char, int> mp;

void init() {
    for (char c = '0'; c <= '9'; c++) {
        mp[c] = c-'0';
    }
    for (char c = 'a'; c <= 'z'; c++) {
        mp[c] = c-'a'+10;
    }
}

long long convert(string know, long long radix) {
    long long num = 0;
    for (int i = 0; i < know.length(); i++) {
        num = num*radix + mp[know[i]];
    }
    return num;
}

long long find_radix(string unknow, long long num) {
    char min_ch = *max_element(unknow.begin(), unknow.end());
    long long l = mp[min_ch] + 1;
    long long r = max(num, l);

    while (l <= r) {
        long long mid = (l+r)/2;
        long long unknow_val = convert(unknow, mid);
        if (unknow_val == num) {
            return mid;
        } else if (unknow_val < 0 || unknow_val > num) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return -1;
}

int main() {
    init();
    string A, B;
    long long tag, radix, result;
    cin >> A >> B >> tag >> radix;
    if (tag == 1) {
        result = find_radix(B, convert(A, radix));
    } else {
        result = find_radix(A, convert(B, radix));
    }
    if (result == -1) {
        cout << "Impossible";
    } else {
        cout << result;
    }
    return 0;
}

 

### 统计学生数量的方法 要统计给定学生学号列表中的学生总数,可以利用 Python 的集合(`set`)来去重并计算唯一的学生学号数量。以下是实现这一功能的具体方法: 通过将学生学号存入一个列表后转换为集合,再调用 `len()` 函数即可得到不重复的学生数量。 ```python def count_unique_students(student_ids): unique_student_count = len(set(student_ids)) # 使用 set 去重并统计长度 return unique_student_count # 示例输入 student_ids = ["S001", "S002", "S001", "S003", "S002"] unique_count = count_unique_students(student_ids) print(f"进入决赛的学生数量为: {unique_count}") ``` 上述代码片段展示了如何快速统计学生数量[^1]。这里的关键在于使用了集合的数据结构特性——自动去除重复项,从而确保每个学生仅被计入一次。 如果需要进一步扩展此功能至更复杂的应用场景,比如基于成绩筛选符合条件的学生,则可参考如下逻辑构建字典或对象模型进行管理[^2][^3]。 #### 扩展:结合字典统计特定条件下的学生数量 当涉及更多维度的信息时(例如成绩),可以通过字典记录每位学生的详细情况,并依据设定的标准过滤目标群体。 ```python students_info = { "S001": {"name": "Alice", "score": 95}, "S002": {"name": "Bob", "score": 87}, "S003": {"name": "Charlie", "score": 92} } def filter_students_by_score(students, min_score=90): qualified_students = [sid for sid, info in students.items() if info["score"] >= min_score] return qualified_students qualified_sids = filter_students_by_score(students_info) count_qualified = len(qualified_sids) print(f"达到数标准的学生有{count_qualified}名,别是:{', '.join(qualified_sids)}") ``` 以上脚本实现了对学生按成绩阈值类的功能。它不仅能够帮助我们了解满足条件的人数,还提供了具体名单以便后续操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值