博客
关于我
Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余
阅读量:790 次
发布时间:2023-02-10

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

为了解决这个问题,我们需要计算 Mr.BG 在给定约束下形成的所有可能字符串中非回文字符串的数量。我们将使用数学方法来高效地解决这个问题。

方法思路

  • 问题分析:Mr.BG 有 M 种不同的字母,每种有 N 个。他从中选出 N 个小球,放到 N 个盒子里,每个盒子放一个小球。我们需要计算所有可能的字符串中,非回文字符串的数量。
  • 总排列数:每个盒子可以选择 M 个字母中的任意一个,因此总排列数为 ( M^N )。
  • 回文排列数:回文字符串的对称性要求每个对称位置对字符相同。计算回文排列数时,考虑长度为 N 的字符串的对称结构,分别计算偶数和奇数的情况。
  • 快速幂计算:为了高效计算大数的幂取模,使用快速幂算法。
  • 解决代码

    MOD = 10**9 + 7def main():    import sys    input = sys.stdin.read    data = input().split()    TC = int(data[0])    index = 1    for _ in range(TC):        N = int(data[index])        M = int(data[index+1])        index += 2        if N == 0 or M == 0:            print(0)            continue        total = pow(M, N, MOD)        if N % 2 == 0:            k = N // 2        else:            k = (N + 1) // 2        palindrome = pow(M, k, MOD)        res = (total - palindrome) % MOD        print(res)if __name__ == "__main__":    main()

    代码解释

  • 读取输入:使用 sys.stdin.read 读取所有输入数据,处理多个测试用例。
  • 处理每个测试用例:读取 N 和 M,处理特殊情况(如 N=0 或 M=0)。
  • 计算总排列数:使用 pow 函数计算 ( M^N \mod (10^9 + 7) )。
  • 计算回文排列数:根据 N 的奇偶性分别计算对称位置对的数量,使用快速幂计算回文排列数。
  • 计算结果:总排列数减去回文排列数,取模后输出结果。
  • 该方法通过数学分析和快速幂算法,高效地解决了问题,确保了计算的正确性和性能。

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

    你可能感兴趣的文章
    Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放
    查看>>
    Monitor
    查看>>
    Monitorr 任意文件上传漏洞复现(CVE-2024-0713)
    查看>>
    Monitor原理
    查看>>
    Monkey学习
    查看>>
    Mono ASP.NET core 添加 Entity Framework
    查看>>
    Monod生长/降解方程对实验数据的曲线拟合
    查看>>
    MonoGame 示例项目教程
    查看>>
    MVP
    查看>>
    Moore's voting algorithm
    查看>>
    mORMot Js对象解析 Json 实例
    查看>>
    MOSFET学习
    查看>>
    MOss213获得用户登录名
    查看>>
    mount --bind 的妙用
    查看>>
    Mount 使用方法
    查看>>
    mount: none already mounted or /cgroup busy
    查看>>
    mount命令详解及实例分析
    查看>>
    Mount实现Linux之间数据互相共享
    查看>>
    mouseover,mouseenter,mouseout,mouseleave的区别
    查看>>
    move
    查看>>