Han Xin and His Troops(扩展中国剩余定理 Python版)

Han Xin and His Troops(扩展中国剩余定理 Python版)

题目来源:2019牛客暑期多校训练营(第十场)

D - Han Xin and His Troops

题意:

看标题就知道大概了,韩信点兵的典故我们应该都熟悉吧。
  给出 n 个同余方程,问是否存在不超过 m 的正整数解。
 

坑点:

  数据比较大,直接用 CRT 会爆 ll,这时候就用 Python 来实现。
 

AC代码:

n = 110         # 同余方程个数
a = [0]*110     # 余数
m = [0]*110     # 模数


"""扩展欧几里得"""
def exgcd(a, b):
    if 0 == b:
        return 1, 0, a
    x, y, q = exgcd(b, a % b)
    x, y = y, (x - a // b * y)
    return x, y, q
 

"""扩展中国剩余定理"""
def CRT():
    if n == 1 :
        if m[0] > a[0]:
            return a[0];
        else:
            return -1;
     
    for i in range(n):
        if m[i] <= a[i] :
            return -1;

        x, y, d = exgcd(m[0], m[i])
        if (a[i] - a[0]) % d != 0:
            return -1;    
            
        t = m[i] // d;
        x = (a[i] - a[0]) // d * x % t
        a[0] = x * m[0] + a[0];
        m[0] = m[0] * m[i] // d;
        a[0] = (a[0] % m[0] + m[0]) % m[0]
 
    return a[0];


n, k = map(int, input().split())
 
for i in range(n):
    m[i], a[i] = map(int, input().split())
 
ans = CRT()
if ans==-1:
    print("he was definitely lying")
elif ans<=k:
    print(ans)
else :
    print("he was probably lying")

 
 

PS:扩展中国剩余定理似乎与中国剩余定理(CRT)关系不大,以下给出推导过程。
 
对于一组同余方程

{xa1 mod m1xa2 mod m2xan mod mn

我们通过依次合并两组方程得到新的同余方程,这样经过 n1 次操作后,就能得到方程组的解。

首先对于前两组方程有:

x=a1+k1m1x=a2+k2m2

可得

k1m1k2m2=a2a1

由扩展欧几里得,我们可以得到下面方程的解 x0,y0

x0m1y0m2=(m1,m2)

d=(m1,m2)
当且仅当 (a2a1) mod d=0,方程有解。

所以

x0a2a1dm1y0a2a1dm2=a2a1

所以我们得到 k1 的一组解为

k1=x0a2a1d

方程的通解形式为

k1=k1+nm2dk2=k2nm1d

k1 的最小整数解为

k1=k1 mod (m2/d)

代回原方程 x=a1+k1n1,我们得到 x 的解以及 a.
此时方程组合并后的模数为

M=m1m2/d

因此原方程合并为

x=a mod M

 

posted @   izcat  阅读(1251)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2018-08-27 水题两篇 Dream & Find Integer (HDU 6440/6441)
点击右上角即可分享
微信分享提示