Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余
发布日期:2025-04-15 08:12:57 浏览次数:5 分类:精选文章

本文共 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 的奇偶性分别计算对称位置对的数量,使用快速幂计算回文排列数。
  • 计算结果:总排列数减去回文排列数,取模后输出结果。
  • 该方法通过数学分析和快速幂算法,高效地解决了问题,确保了计算的正确性和性能。

    上一篇:MySql DML语言新增多行数据、修改删除多个表
    下一篇:MySQL DELETE 表别名问题

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年05月17日 05时36分53秒