中国剩余定理
概念
求解关于 (x) 的一元线性同余方程组:
[egin{cases} x equiv a_1 pmod{m_1} \ xequiv a_2 pmod{m_2} \ dots \ x equiv a_n pmod{m_n}end{cases}
]
其中 (m_1,m_2,m_3 dots m_n) 两两互质。
解为 (x=sumlimits_{i=1}^na_ifrac{M}{m_i}t_i),其中 (M=prodlimits^n_{i=1}m_i,frac{M}{m_i}t_iequiv 1 pmod{m_i}),即 (t_i) 为 (frac{M}{m_i}) 在模 (m_i) 意义下的逆元。
证明
由 (m_i mid M),得:
[largeforall k
ot = i, a_kfrac{M}{m_k}t_kequiv0 pmod{m_i}
]
由 (frac{M}{m_i}t_iequiv1({ m mod} m_i)),得:
[large a_ifrac{M}{m_i}t_i equiv a_i pmod{m_i}
]
所以得证 (x=sumlimits_{i=1}^na_ifrac{M}{m_i}t_i)。
通解为 (x+k imes Mleft(k in Z ight))。注意计算 (frac{M}{m_i}t_i) 时,不要对 (m_i) 取模。
ll crt()
{
ll ans=0,M=1;
for(int i=1;i<=n;++i) M*=m[i];
for(int i=1;i<=n;++i)
{
exgcd(M/m[i],m[i]);
x=(x%m[i]+m[i])%m[i];
ans=(ans+a[i]*M/m[i]*x)%M;
}
return ans;
}
扩展中国剩余定理
概念
求解关于 (x) 的一元线性同余方程组:
[egin{cases} x equiv a_1 pmod{m_1} \ xequiv a_2 pmod{m_2} \ dots \ x equiv a_n pmod{m_n}end{cases}
]
其中 (m_1,m_2,m_3 dots m_n) 不保证两两互质。
因为不保证两两互质,所以 (frac{M}{m_i}) 在模 (m_i) 意义下不一定存在逆元,不能直接做。
考虑为两个方程的情况:
[egin{cases} x equiv a_1 pmod{m_1} \ xequiv a_2 pmod{m_2} \end{cases}
]
写成不定方程的形式,得:
[large x=a_1+m_1t_1=a_2+m_2t_2
]
再进行转化,得:
[large m_1t_1-m_2t_2=a_2-a_1
]
由裴蜀定理得,当 (gcd(m_1,m_2) ot mid a_2-a_1) 时,方程无解。有解时可通过 (exgcd) 算出一组可行解,得原方程组的解为 (x equiv m_1t_1+a_1 pmod{ operatorname{lcm}(m_1,m_2) })。
多个方程时就两两合并即可。
ll excrt()
{
ll ans=a[1],M=m[1];
for(int i=2;i<=n;++i)
{
ll g=exgcd(M,m[i]),tmp=((a[i]-ans)%m[i]+m[i])%m[i];
if(tmp%g!=0) return -1;
ans+=mul(x,tmp/g,m[i])*M,M*=m[i]/g,ans=(ans%M+M)%M;
}
return ans;
}