考虑我们显然可以用一次 (nlogn) 的过程,求出如果可以砍第 (i) 头,他将使用的刀的攻击力。
于是我们转为求这样一个方程组:
(left{
egin{aligned}
m_1a_1equiv b_1pmod{q_1}\
m_2a_2equiv b_2pmod{q_2}\
.....\
m_3a_3equiv b_3pmod{q_3}\
end{aligned}
ight.)
我们发现他并不好解。
那么我们就只能考虑使用(exgcd),显然如果有方程没解,则全局无解。
我们单独拉一个出来看(maequiv bpmod p)
我们则有(ma + kp = b)
设解为(S_a,S_p)。
通解公式有:
那么就有(a = S_a + kfrac{p}{gcd(m,p)})
于是我们转为了这个方程:(aequiv S_apmod{frac{p}{gcd(m,p)}})
于是我们可以使用(exCRT)求解。
(exCRT)说白了就是合并这个同余方程。
(aequiv C_1pmod {P_1})
(aequiv C_2pmod {P_2})
所以有
(x = C_1 + P_1 y_1)
(x = C_2 + P_2 y_2)
所以有:
(P_1y_1 = P_2y_2 + C_1 - C_2)
同除这个(gcd(P_1,P_2))
那么有(frac{P_1}{gcd(P_1,P_2)}y_1 = frac{P_2}{gcd(P_1,P_2)}y_2 + frac{C_1 - C_2}{gcd(P_1,P_2)})
(frac{P_1}{gcd(P_1,P_2)}y_1 equiv frac{C_1 - C_2}{gcd(P_1,P_2)}pmod{frac{P_2}{gcd(P_1,P_2)}})
此时系数和膜数互质。
(y_1 equiv frac{C_1 - C_2}{gcd(P_1,P_2)} * inv(frac{P_1}{gcd(P_1,P_2)},frac{P_2}{gcd(P_1,P_2)})pmod{frac{P_2}{gcd(P_1,P_2)}})
此时
(y_1 = frac{C_1 - C_2}{gcd(P_1,P_2)} * inv(frac{P_1}{gcd(P_1,P_2)},frac{P_2}{gcd(P_1,P_2)}) + kfrac{P_2}{gcd(P_1,P_2)})
带回原式,有:
(x equiv C_1 + P_1(frac{(C_1 - C_2)}{gcd(P_1,P_2)} * inv(frac{P_1}{gcd(P_1,P_2)},frac{P_2}{gcd(P_1,P_2)})mod frac{P2}{gcd(P_1,P_2)}) pmod {frac{P_1P_2}{gcd(P_1,P_2)}})