2019牛客暑期多校训练营(第十场)Han Xin and His Troops——扩展中国剩余定理

题意

求解 $n$ 个模方程 $x \equiv a (mod \ b)$,不保证模数互素($1 \leq n \leq 100$,$0 \leq b < a< 10^5$).

分析

套扩展中国剩余定理的模板,

然而__int128都会爆(好像也可以改成不会爆的),

不管,直接扔给队友改成Python版。

def gcd(a,b):
    if b==0:
        return a
    else :
        return gcd(b,a%b)
 
def exgcd(a,b):
    if b == 0:
        return 1,0
    else:
        y,x = exgcd(b, a%b)
        y = y - (a//b)*x
        return x,y
 
def inv(a,b):
    x,y = exgcd(a,b)
    while x<0 :
        x = b+x
    return x,y
 
MAXN = int(1e6+10)
C = [0]*110
M = [0]*110
str = input().split(" ")
k = int(str[0])
lim = int(str[1])
for i in range(1,k+1):
    str = input().split(" ")
    M[i] = int(str[0])
    C[i] = int(str[1])
flag = True
for i in range(2,k+1):
    M1 = M[i-1]
    M2 = M[i]
    C2 = C[i]
    C1 = C[i-1]
    T = gcd(M1,M2)
    if (C2-C1)%T != 0:
        flag = False
        break
    M[i] = (M1*M2)//T
    x,y = inv(M1//T,M2//T)
    C[i] = (x * (C2 - C1) // T ) % (M2 // T) * M1 +C1
    C[i] = (C[i] % M[i] + M[i]) % M[i]
 
if flag:
    if C[k] > lim :
        print("he was probably lying")
    else :
        print(C[k])
else :
    print("he was definitely lying")

猜你喜欢

转载自www.cnblogs.com/lfri/p/11372193.html
今日推荐