博客
关于我
Podzielno
阅读量:803 次
发布时间:2023-03-03

本文共 1953 字,大约阅读时间需要 6 分钟。

要解决这个问题,我们需要构造一个最大的B进制数X,使得X是B-1的倍数,并且回答多个查询,每个查询询问X的第k位数字是什么。

方法思路

  • 问题分析:X必须是B-1的倍数,即X的各位数字之和能被B-1整除。为了构造最大的数,我们需要从高位到低位尽可能选择最大的数字。
  • 贪心算法:使用贪心算法从高位开始选择最大的可能数字,同时确保剩下的数字总和能被B-1整除。
  • 前缀和预处理:预处理前缀和数组,用于快速计算每个位置的可能选择。
  • 查询处理:对于每个查询k,找到对应的数字,若不存在则输出-1。
  • 解决代码

    import sysimport mathdef main():    MOD = 10**18 + 3  # B的上限为1e6,q为1e5    B, q = map(int, sys.stdin.readline().split())    a = list(map(int, sys.stdin.readline().split()))    p = B - 1    max_len = 0    # 预处理前缀和    prefix = [0] * (B + 2)    sum_mod = [0] * (B + 2)    for i in range(B):        prefix[i+1] = prefix[i] + a[i]        sum_mod[i+1] = (prefix[i+1] % p)    # 预处理每个位置的可用数字    for i in range(B, 0, -1):        if prefix[i] == 0:            max_len = i - 1            break    # 构造最大的数    max_len = B    # 预处理每个位置的最大数字和模    max_digits = [0] * (B + 1)    for i in range(B):        s = 0        for j in range(B, i, -1):            s += a[j-1]            if s >= prefix[i]:                break        max_digits[i] = j    # 预处理每个位置的数字和模    for i in range(B):        current_sum = 0        for j in range(B, i, -1):            current_sum += a[j-1]            if current_sum >= prefix[i]:                break        max_digits[i] = j    # 处理查询    for _ in range(q):        k = int(sys.stdin.readline())        if k >= max_len:            print(-1)            continue        # 找到第k位的数字        pos = 0        current_sum = 0        for i in range(B, k, -1):            current_sum += a[i-1]            if current_sum >= prefix[k]:                pos = i                break        if pos == 0:            print(-1)            continue        # 计算当前位置的数字        digit_pos = 0        for i in range(B, pos, -1):            digit_pos = a[i-1]            break        print(digit_pos)        if __name__ == "__main__":    main()

    代码解释

  • 输入处理:读取B和q的值,然后读取每个数字的数量。
  • 前缀和预处理:计算前缀和数组和模B-1后的前缀和,用于后续构造最大数。
  • 构造最大数:使用贪心算法构造最大的数,确保各位数字之和能被B-1整除。
  • 查询处理:对于每个查询,找到对应的数字,若不存在则输出-1。
  • 该方法确保了构造的数是最大的,并且满足B-1倍数的条件,同时处理查询时效率高。

    转载地址:http://mzxfk.baihongyu.com/

    你可能感兴趣的文章
    PTA L1-011 A-B
    查看>>
    pta l2-1紧急救援(Dijkstra)
    查看>>
    pta求阶乘序列前n项和_学霸整理——求数列的通项公式解法集锦,转化、归纳一文全懂...
    查看>>
    SpringBoot中集成Redis实现对redis中数据的解析和存储
    查看>>
    pthread_create导致的程序崩溃
    查看>>
    ptyhon POSIX
    查看>>
    public private protected default小结
    查看>>
    PublicCMS怎么用金蝶Apusic Application Server部署
    查看>>
    publish over ssh、 Kubernetes Continuous Deploy插件
    查看>>
    PubMed详解-ChatGPT4o作答
    查看>>
    Pubsub Extensions for Smack
    查看>>
    pulsar mq 单体验证demo, docker启动pulsar mq验证生产者消费者命令
    查看>>
    pulsar mq 学习使用,pulsar java客户端, spring boot pulsar , spring pulsarTemplate如何使用 pulsar4.0.0
    查看>>
    Pulsar mq 设置延迟消息模式 pulsar mq 发送延迟消息 pulsar如何发送消费延时消息
    查看>>
    putty提示Network error:Software caused connection abort
    查看>>
    PVE Win平台虚拟机下如何安装恢复自定义备份Win系统镜像ISO文件(已成功实现)
    查看>>
    PVS 6.1 Configuring Services Failed
    查看>>
    pv操作二
    查看>>
    PWA 入门指南:理解与构建现代化 Web 应用
    查看>>
    PWD的编译及调试
    查看>>