中国剩余定理小记

Preface

做 qbxt 原题 GCD Table 的时候忽然发现自己不会 excrt,爬去学了一下 QwQ .

CRT 一个平凡的应用是叫做 CRT 合并的东西 .

一元线性同余方程组

问题描述

解同余方程组

{xa1(modn1)xa2(modn2)xak(modnk)

显然 x 有无数个解,我们只要找出 [0,lcm(n1,n2,,nk)) 中的一个解(即最小自然数解)即可 .

有一个科技叫做 Garner 算法,oi wikiLOJ 上都有资料,听说老早就 wellknown 了,但是我显然不会呀 QwQ .

互素情形 - CRT

互素,也就是 n1,n2,,nk 两两互素 .

虽然说是互素吧,但其实一般都是 n1,n2,,nk 都是素数,毕竟出题人造一组两两互素的数也挺难的 .

引出中国剩余定理(Chinese Remainder Theorem, CRT):

Chinese Remainder Theorem

对于 ni 两两互素的一元线性同余方程组,令 n=i=1knimi=nni,则:

xi=1kaimimi1(modn)

其中 mi1mini 意义下的逆元 .

证明:

Ri=mimi1,我们发现:

{Ri1(modni)Ri0(modnj)ij

因为 ni 是两两互素的,所以这非常显然 .

于是可以轻易验证 x=i=1kaiRi 满足条件,同余 n 类似 .


此时的时间复杂度就是 O(klog(ni)),后面 log 部分是我自己 YY 的,不对请指出 .

其实这里我们可以发现要求的是 ni 互素,所以逆元一定存在 .

那如果逆元不一定存在,CRT 就失效了,下面来探讨一下一般情况 .

非互素情形 - ExCRT

虽然叫 ExCRT,但是和 CRT 一点关系都没有 .


考虑合并两个同余方程组:

{xa1(modn1)xa2(modn2)

答案显然是 modlcm(n1,n2) 意义下的,回去看 CRT 可以发现乘积其实是 lcm 的特例 .

x=k1n1+a1=k2n2+a2,于是移项就得到

k1n1k2n2=a2a1

两边同时 modn2

k1n1a2a1(modn2)

根据 mod 的分配律,这个可以变成

k1n1gcd(n1,n2)a2a1gcd(n1,n2)(modn2gcd(n1,n2))

exgcd 解出 k1,然后代回去就能求 x 了,可以证明答案是 modlcm(n1,n2) 意义下的 .

我也不知道对不对因为我也没写过

zhx 黑科技 - 大数翻倍法

其实不互素情形的关键就是合并同余方程组 .

先把任务写上,就是要合并下面这个玩意呗

{xa1(modn1)xa2(modn2)

首先答案肯定是 modlcm(n1,n2) 意义下的,问题就是要找 xmodlcm(n1,n2) 是多少 .

我们考虑直接暴力,枚举所有满足第一个同余方程的 x,然后一个一个判断是否满足第二个,这样就找到答案了 .

做完了?真做完了 .

然而我们可以整一个类似启发式的东西,钦定上 n1>n2,这样能少跳几次 .

显而易见跳超过 n2 次就一定无解,因为肯定会产生循环,于是时间复杂度就是 O(n2) .

想想这玩意咋行啊,总复杂度不就是 O(ni) 了吗,肯定 GG 啊 .

这里就要用到神秘的 zhx 分析法了!!

首先 ni 肯定不会爆 long long,要不然出题人也做不了,不妨就令其最大值为 1018 吧 .

然后出题人如果想要卡我们,肯定得用大素数,要不然跳几下就找到解了 .

此时分析 ni,最大值肯定取到 n=2n=1 还合并个毛啊),此时大概就跑 109 次,这样就卡掉了 .

再检验一下 n=3,大概是 3×106 级别,稳过 .

但是我们发现根据均值不等式,n 再大肯定答案越小,于是很大概率就卡不掉了 .

出题人不可能整一堆 n=2 吧 /hanx 出题人也不一定知道这个算法

于是这个黑科技就被证明跑得飞快了

核心代码不超过 5 行哦,这里 是一份实现 .

posted @   yspm  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示