洛谷 P4777 【模板】扩展中国剩余定理(EXCRT)

【题目链接】

洛谷 P4777 【模板】扩展中国剩余定理(EXCRT)

【题目考点】

1. 扩展中国剩余定理

问题:求解线性同余方程组:
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) ⋮ x ≡ a n ( m o d m n ) \begin{cases} x \equiv a_1 \pmod{m_1} \\ x \equiv a_2 \pmod{m_2} \\ \vdots \\ x \equiv a_n \pmod{m_n} \end{cases} ⎩ ⎨ ⎧x≡a1(modm1)x≡a2(modm2)⋮x≡an(modmn)

应用中国剩余定理的前提是模数 m 1 , m 2 , . . . , m n m_1, m_2, ..., m_n m1,m2,...,mn是互质的。

而当前问题不保证模数互质,因此无法使用基本的中国剩余定理解决该问题。

以下给出使用扩展中国剩余定理求线性同余方程组的解法。

以下为了方便讨论,将 x x x变为 z z z,求解同余方程组:
{ z ≡ a 1 ( m o d m 1 ) z ≡ a 2 ( m o d m 2 ) ⋮ z ≡ a n ( m o d m n ) \begin{cases} z \equiv a_1 \pmod{m_1} \\ z \equiv a_2 \pmod{m_2} \\ \vdots \\ z \equiv a_n \pmod{m_n} \end{cases} ⎩ ⎨ ⎧z≡a1(modm1)z≡a2(modm2)⋮z≡an(modmn)

根据同余的定义,如果 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1),那么 m 1 ∣ ( z − a 1 ) m_1\mid(z-a_1) m1∣(z−a1)。

存在整数 x x x满足 z − a 1 = x m 1 z-a_1=xm_1 z−a1=xm1, z = a 1 + x m 1 z=a_1+xm_1 z=a1+xm1

同理,对于 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2),存在整数 y y y满足 z = a 2 − y m 2 z=a_2-ym_2 z=a2−ym2

因此: a 1 + x m 1 = a 2 − y m 2 a_1+xm_1=a_2-ym_2 a1+xm1=a2−ym2
x m 1 + y m 2 = a 2 − a 1 xm_1+ym_2=a_2-a_1 xm1+ym2=a2−a1,求解该不定方程。

  • 如果 g c d ( m 1 , m 2 ) ∤ ( a 2 − a 1 ) gcd(m_1,m_2)\nmid (a_2-a_1) gcd(m1,m2)∤(a2−a1),则该不定方程无解。此时不存在 z z z的值能同时满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2),因此同余方程组无解。

反证法:假设 g c d ( m 1 , m 2 ) ∤ ( a 2 − a 1 ) gcd(m_1,m_2)\nmid (a_2-a_1) gcd(m1,m2)∤(a2−a1)的前提下存在解 x = x 0 , y = y 0 x=x_0, y = y_0 x=x0,y=y0满足 x m 1 + y m 2 = a 2 − a 1 xm_1+ym_2=a_2-a_1 xm1+ym2=a2−a1。
x 0 m 1 + y 0 m 2 x_0m_1+y_0m_2 x0m1+y0m2是 m 1 , m 2 m_1,m_2 m1,m2的线性组合, g c d ( m 1 , m 2 ) gcd(m_1,m_2) gcd(m1,m2)是 m 1 , m 2 m_1,m_2 m1,m2的公约数,根据公约数整除线性组合,有 g c d ( m 1 , m 2 ) ∣ x 0 m 1 + y 0 m 2 gcd(m_1,m_2)\mid x_0m_1+y_0m_2 gcd(m1,m2)∣x0m1+y0m2,即 g c d ( m 1 , m 2 ) ∣ ( a 2 − a 1 ) gcd(m_1,m_2)\mid (a_2-a_1) gcd(m1,m2)∣(a2−a1),与已知前提矛盾,假设不成立,原命题得证。

如果存在解 z = z 0 z=z_0 z=z0满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2),那么 z 0 = a 1 + x m 1 = a 2 − y m 2 z_0=a_1+xm_1=a_2-ym_2 z0=a1+xm1=a2−ym2

那么存在一组解 x 0 = ( z 0 − a 1 ) / m 1 , y 0 = ( a 2 − z 0 ) / m 2 x_0=(z_0-a_1)/m_1, y_0=(a_2-z_0)/m_2 x0=(z0−a1)/m1,y0=(a2−z0)/m2满足 x 0 m 1 + y 0 m 2 = a 2 − a 1 x_0m_1+y_0m_2=a_2-a_1 x0m1+y0m2=a2−a1,而当前该不定方程无解,产生矛盾。所以不存在解同时满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2)

  • 如果 g c d ( m 1 , m 2 ) ∣ ( a 2 − a 1 ) gcd(m_1,m_2)\mid (a_2-a_1) gcd(m1,m2)∣(a2−a1),那么不定方程 x m 1 + y m 2 = a 2 − a 1 xm_1+ym_2=a_2-a_1 xm1+ym2=a2−a1有解。
    设 g = g c d ( m 1 , m 2 ) g=gcd(m_1,m_2) g=gcd(m1,m2)
    先求出 x m 1 + y m 2 = g xm_1+ym_2=g xm1+ym2=g的一组解 x 0 , y 0 x_0,y_0 x0,y0
    方程两边乘以 a 2 − a 1 g \dfrac{a_2-a_1}{g} ga2−a1,得 x 0 ( a 2 − a 1 ) m 1 g + y 0 ( a 2 − a 1 ) m 2 g = a 2 − a 1 \frac{x_0(a_2-a_1)m_1}{g}+\frac{y_0(a_2-a_1)m_2}{g}=a_2-a_1 gx0(a2−a1)m1+gy0(a2−a1)m2=a2−a1
    等式左侧加、减 l c m ( m 1 , m 2 ) = m 1 m 2 g lcm(m_1,m_2)=\frac{m_1m_2}{g} lcm(m1,m2)=gm1m2的 k k k倍,得:
    ( x 0 ( a 2 − a 1 ) g + k m 2 g ) m 1 + ( y 0 ( a 2 − a 1 ) g − k m 1 g ) m 2 = a 2 − a 1 (\frac{x_0(a_2-a_1)}{g}+k\frac{m_2}{g})m_1+(\frac{y_0(a_2-a_1)}{g}-k\frac{m_1}{g})m_2=a_2-a_1 (gx0(a2−a1)+kgm2)m1+(gy0(a2−a1)−kgm1)m2=a2−a1
    所以不定方程 x m 1 + y m 2 = a 2 − a 1 xm_1+ym_2=a_2-a_1 xm1+ym2=a2−a1的解为 x = x 0 ( a 2 − a 1 ) g + k m 2 g x=\frac{x_0(a_2-a_1)}{g}+k\frac{m_2}{g} x=gx0(a2−a1)+kgm2
    其中 k k k是任意整数, x 0 x_0 x0为 x m 1 + y m 2 = g xm_1+ym_2=g xm1+ym2=g的 x x x的一个解。
    其最小非负整数解为 x = x 0 ( a 2 − a 1 ) g   m o d   m 2 g x=\frac{x_0(a_2-a_1)}{g} \bmod \frac{m_2}{g} x=gx0(a2−a1)modgm2
    将 x x x的解代入 z = a 1 + x m 1 z=a_1+xm_1 z=a1+xm1得到
    z 0 = a 1 + m 1 ( x 0 ( a 2 − a 1 ) g   m o d   m 2 g ) z_0=a_1+m_1(\frac{x_0(a_2-a_1)}{g} \bmod \frac{m_2}{g}) z0=a1+m1(gx0(a2−a1)modgm2)
    z = z 0 z=z_0 z=z0同时满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2)
    已知当 m ∣ M m\mid M m∣M时, a ≡ a   m o d   M ( m o d m ) a\equiv a\bmod M\pmod m a≡amodM(modm)

证明:由于 m ∣ M m\mid M m∣M,设 M = p m M=pm M=pm

根据除法定理: a = q M + ( a   m o d   M ) a = qM+(a\bmod M) a=qM+(amodM)
a − ( a   m o d   M ) = q M = p q m a-(a\bmod M)=qM=pqm a−(amodM)=qM=pqm

所以 m ∣ ( a − ( a   m o d   M ) ) m\mid (a-(a\bmod M)) m∣(a−(amodM))

即 a ≡ a   m o d   M ( m o d m ) a\equiv a\bmod M\pmod m a≡amodM(modm)

设 c m = l c m ( m 1 , m 2 ) = m 1 m 2 g c d ( m 1 , m 2 ) cm =lcm(m_1, m_2)= \frac{m_1m_2}{gcd(m_1,m_2)} cm=lcm(m1,m2)=gcd(m1,m2)m1m2,

由于 m 1 ∣ c m m_1\mid cm m1∣cm,所以 z 0 ≡ z 0   m o d   c m ≡ a 1 ( m o d m 1 ) z_0\equiv z_0\bmod cm\equiv a_1 \pmod{m_1} z0≡z0modcm≡a1(modm1),即 z = z 0   m o d   c m z=z_0 \bmod cm z=z0modcm满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)。

由于 m 2 ∣ c m m_2\mid cm m2∣cm,所以 z 0 ≡ z 0   m o d   c m ≡ a 2 ( m o d m 2 ) z_0\equiv z_0\bmod cm\equiv a_2 \pmod{m_2} z0≡z0modcm≡a2(modm2),即 z = z 0   m o d   c m z=z_0 \bmod cm z=z0modcm满足 z ≡ a 2 ( m o d m 1 ) z \equiv a_2 \pmod{m_1} z≡a2(modm1)。

同余方程组的解 z ′ z' z′只要满足 z ′ ≡ z 0 ( m o d c m ) z'\equiv z_0 \pmod{cm} z′≡z0(modcm),那么
z ′ ≡ z ′   m o d   c m ≡ z 0   m o d   c m ≡ a 1 ( m o d m 1 ) z'\equiv z'\bmod cm\equiv z_0 \bmod cm\equiv a_1\pmod{m_1} z′≡z′modcm≡z0modcm≡a1(modm1)
z ′ ≡ z ′   m o d   c m ≡ z 0   m o d   c m ≡ a 2 ( m o d m 2 ) z'\equiv z'\bmod cm\equiv z_0 \bmod cm\equiv a_2\pmod{m_2} z′≡z′modcm≡z0modcm≡a2(modm2)

即 z ′ z' z′同时满足 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2)。

可以使用同余方程 z ≡ z 0 ( m o d c m ) z\equiv z_0 \pmod{cm} z≡z0(modcm)代替 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2)。

因此可以视为将同余方程 z ≡ a 1 ( m o d m 1 ) z \equiv a_1 \pmod{m_1} z≡a1(modm1)与 z ≡ a 2 ( m o d m 2 ) z \equiv a_2 \pmod{m_2} z≡a2(modm2)合并为:
z ≡ a 1 + m 1 ( x 0 ( a 2 − a 1 ) g   m o d   m 2 g ) ( m o d l c m ( m 1 , m 2 ) ) z\equiv a_1+m_1(\frac{x_0(a_2-a_1)}{g} \bmod \frac{m_2}{g})\pmod{lcm(m_1, m_2)} z≡a1+m1(gx0(a2−a1)modgm2)(modlcm(m1,m2))

其中 x 0 x_0 x0为 x m 1 + y m 2 = g xm_1+ym_2=g xm1+ym2=g的 x x x的一个解。

不断合并同余方程,直到只剩下一个同余方程 z ≡ z 0 ( m o d l c m ( m 1 , m 2 , . . . , m n ) ) z\equiv z_0 \pmod{lcm(m_1, m_2, ..., m_n)} z≡z0(modlcm(m1,m2,...,mn))

此时 z 0 z_0 z0为同余方程组的解。

【解题思路】

对于本题,在合并同余方程组时,其中某步为:

将同余方程 z ≡ c a ( m o d c m ) z\equiv ca \pmod{cm} z≡ca(modcm)与 z ≡ a i ( m o d m i ) z\equiv a_i\pmod{m_i} z≡ai(modmi)合并为:
z ≡ c a + c m ( x 0 ( a i − c m ) g   m o d   m i g ) ( m o d l c m ( c m , m i ) ) z\equiv ca+cm(\frac{x_0(a_i-cm)}{g} \bmod \frac{m_i}{g})\pmod{lcm(cm, m_i)} z≡ca+cm(gx0(ai−cm)modgmi)(modlcm(cm,mi))

注意计算过程应在__int128类型下完成,否则中间结果可能超出long long类型的范围。

【题解代码】

解法1:扩展中国剩余定理
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define MOD(a, b) (((a)%(b)+(b))%(b))
typedef long long LL;
void exgcd(LL a, LL b, LL &x, LL &y, LL &g)
{
	if(b == 0)
	{
		x = 1, y = 0, g = a;
		return;
	}
	exgcd(b, a%b, y, x, g);
	y -= a/b*x;
}
LL exCRT(LL *a, LL *m, LL n)//x≡a[i] (mod m[i])
{
	LL ca = a[1], cm = m[1], x, y, g, lcm;
	for(int i = 2; i <= n; ++i)
	{
		exgcd(cm, m[i], x, y, g);//求不定方程 x*cm+y*m[i] = g中x、y的解
		if((a[i]-ca)%g != 0)
			return -1;//无解时返回-1,尽管本题保证有解 
		lcm = cm/g*m[i];//lcm(cm, m[i])
		ca = MOD(MOD((__int128)(a[i]-ca)/g*x, m[i]/g)*cm+ca, lcm);//此处不能使用函数mod,因为会把int128类型转为LL类型,有精度丢失 
		cm = lcm;
	}
	return ca;
} 
int main()
{
	LL a[N], b[N], n;
	cin >> n;
	for(int i = 1; i <= n; ++i)
		cin >> a[i] >> b[i];
	cout << exCRT(b, a, n);
	return 0;
}
相关推荐
天赐学c语言2 小时前
12.14 - 搜索旋转排序数组 && 判断两个结构体是否相等
数据结构·c++·算法·leecode
1024肥宅2 小时前
JavaScript 性能与优化:数据结构和算法
前端·数据结构·算法
kaikaile19952 小时前
MATLAB 灰度图像的二维傅里叶变换
算法·计算机视觉·matlab
仰泳的熊猫2 小时前
1112 Stucked Keyboard
数据结构·c++·算法·pat考试
roman_日积跬步-终至千里3 小时前
【计算机算法与设计(14)】例题五:最小生成树:Prim算法详细解释:π的含义、更新逻辑和选点原因
算法
让学习成为一种生活方式3 小时前
压缩文件夹下下所有文件成压缩包tar.gz--随笔016
算法
嗷嗷哦润橘_3 小时前
AI Agent学习:MetaGPT项目之RAG
人工智能·python·学习·算法·deepseek
不忘不弃3 小时前
指针元素的使用
算法
he___H3 小时前
滑动窗口一题
java·数据结构·算法·滑动窗口