同余进阶
扩展欧拉定理
-
应当注意不能认为总是有 \(a^b\equiv a^{b\bmod\varphi(m)+\varphi(m)} \pmod{m}\),这在第二种情况下可能不对,因为不能保证 \(a^{\varphi(m)}\equiv 1 \pmod{m}\)。
-
证明如下:
-
对于 \(a^0,a^1,\dots ,a^{+\infty}\pmod{m}\),存在 \(r,s\),使得 \(a^0\sim a^{r-1}\) 互不相同,从 \(a^r\) 开始每 \(s\) 个数循环一次。
-
因为 \(\pmod{m}\) 的数集是有限集,故互不相同的 \(a^k\) 是有限的,\(r\) 存在。
-
由鸽笼原理,一定存在 \(k>k'\),使得 \(a^k\equiv a^{k'}\),于是显然循环。
-
-
\(a\in prime\) 时,该式成立。
-
若 \(a\perp m\),为欧拉定理的简单情况。
-
否则,存在 \(t\),使得 \(m=a^tm'\),且 \(a\perp m'\),从而 \(a^{\varphi(m')}\equiv 1\pmod{m'}\)。
-
由欧拉函数的积性,有 \(m'\mid m\to \varphi(m')\mid \varphi(m)\),于是 \(a^{\varphi(m)}\equiv 1\pmod{m'}\)。
-
转为不定方程,\(a^{\varphi(m)}=km'+1\),再在两边同乘 \(a^t\),得到 \(a^{t+\varphi(m)}=km+a^t\)。
-
转回同余式,得到 \(a^t\equiv a^{t+\varphi(m)}\)。利用欧拉函数的积性,有
\[\varphi(m)\geqslant \varphi(a^t)=a^{t-1}(a-1) \]- 注意到 \(a\geqslant 2,t\geqslant 1\),故
\[\varphi(m)\geqslant a^{t-1}(a-1)\geqslant t \]-
其中 \(a^{t-1}(a-1)=t\) 只在 \(a=2,t=1\) 时取得。
-
所以对于 \(a>2\) 或 \(t>1\),有 \(a^t\equiv a^{t+\varphi(m)}\equiv a^{t\bmod m+\varphi(m)}\)。
-
对于 \(a=2 \And t=1\),手动验证发现总有 \(t=1\leqslant \varphi(m)\),\(<\) 时走第二种情况,\(=\) 时显然有 \(2^1=2^{1\bmod 1+1}\)。
-
故该式在 \(a\in prime\) 时成立。
-
-
\(a\in p^k,p\in prime\) 时,该式成立。
- 累了。
-
应用:光速幂。
-
扩展欧拉定理告诉我们,在 \(\pmod m\) 意义下,一切幂的次数都在 \([0,2\varphi(m))\) 中。
-
\(2\varphi(m)\) 还是有点大,考虑使用幂的性质,取 \(sq=\lceil\sqrt{\varphi(m)}\rceil\),于是
\[a^b\equiv a^{\lfloor\frac{b}{sq}\rfloor sq+b\bmod sq}\equiv (a^{\lfloor\frac{b}{sq}\rfloor})^{sq}a^{b\bmod sq} \]- 则可以 \(O(\sqrt{m})-O(1)\) 地求固定底数的幂。一般化地,应当是 \(O(m^{\frac{1}{k}})-O(\log_{m^{\frac{1}{k}}} m)=O(k)\) 的,不过实践中最常用 \(k=2\)。
-
P5091 【模板】扩展欧拉定理
- 板子,使用秦九韶算法即可。注意可能并没有取过模。
中国剩余定理
- 给定如下同余方程组,其中 \(m_i\) 与 \(m_j\) 互质。
-
求最小正整数解。
-
思路:构造一组 \(x_1,x_2,\dots,x_n\),使得 \(x_i\equiv 1\pmod {m_i},x_i\equiv 0\pmod {m_j}(j\neq i)\)。
-
从而我们有 \(x=\sum\limits_{i=1}^{n} b_ix_i\),解系为 \(x_0=x+kM\),最小正整数解 \(x_1=x\bmod M(M=\prod\limits_{i=1}^{n}m_i)\)。
-
证明从构造里就能看出。
-
下面说一下怎么构造。取 \(now_i=\dfrac{M}{m_i}\),显然有 \(now_i\equiv 0\pmod {m_j}\),则 \(x_i=now_i\times now_i^{-1}\pmod {m_i}\)。
扩展中国剩余定理
- 给定如下同余方程组,不保证 \(m_i\) 与 \(m_j\) 互质。
-
原思路所需的性质根本不存在。考虑另起炉灶。
-
尝试将方程合并。
-
令 \(x_0\) 满足前两个方程,则有 \(1\times x_0+m_1\times y_1=b_1\)...(这里第二个式子被省略了)形式不好看,整理一下,\(x_0=m_1\times y_1+b_1=m_2\times y_2+b_2\)。
-
从而有 \(m_1\times y_1-m_2\times y_2=b_2-b_1\)。
-
exGCD。容易给出 \(y\) 从而得到 \(x\)。
-
定理:对如上的二同余方程组,如果有特解 \(x_0\) ,则解系为 \(x\equiv x_0\pmod {\operatorname{lcm}(m_1,m_2)}\) 。这也是合并出的新方程。
-
证明:
-
正确性略,lcm 是可以约掉的。
-
唯一性:假设有 \(x,y\) 都满足要求,则 \(x-y\equiv 0\pmod{m_1}\) 或 \(\pmod{m_2}\),所以 \(x-y\equiv0\pmod {\operatorname{lcm}(m_1,m_2)}\),但 \(x,y<\operatorname{lcm}(m_1,m_2)\),所以 \(x-y=0,x=y\),不成立。
-
-
注意,虽然这个也是转化成剩余系,也可以调整成最小正整数解,但这一步和上面的 exGCD 可以说半毛钱关系都没有,因为 \(x\) 并不是 exGCD 的内容!!!请先用 \(\dfrac{c}{g}\) 把 \(y\) 调整好,再用它来做 \(x\)!!!
-
另外,这里还有一点小 trick。考虑 exCRT 的同余方程中式左 \(x\) 系数不为 \(1\) 的情况。
-
考虑重构该方程。记系数为 \(k\),则原同余方程等价于 \(k\times x+m\times y=b\)。
-
老规矩,先用裴蜀定理判一下解的存在性。然后得出 \(x\) 的解系,从而对应母方程等价于该解系。
Miller-Rabin 素性测试
-
设法在比试除法更低的时间复杂度内判断 \(n\) 是不是一个素数。显然保真的算法复杂度不太能接受,故我们考虑一点不保真的随机化算法。
-
注意到费马小定理保证 \(\forall a\perp p,a^{p-1}\equiv 1\pmod p\)。不妨用这个来试试?随一些 \(<n\) 的 \(a\) 出来,快速幂检验之。
-
听起来不错,可惜,存在无穷多个卡迈克尔数 \(n\),满足 \(n\) 是合数但 \(\forall a\perp n,a^{n-1}\equiv 1\pmod n\)。换言之面对它们我们的算法就是蒙约数...而约数的规模上界是 \(O(n^\frac{1}{3})\),想稳定命中的代价有点大呢,尤其是某些大质数相乘,根本测不出来。
-
引入二次探测定理:若 \(p\) 为奇素数,则 \(x^2\equiv 1\pmod p\) 的解为 \(x=\pm 1\pmod p\)。
-
理由较为显然,将 \(1\) 换到左侧利用平方差公式展开,得到 \((x+1)(x-1)\equiv 0\pmod p\)。
-
显然只能是 \(x+1\) 或 \(x-1\) 中含 \(p\)(\(0\) 也行,模意义下嘛),故解为 \(\pm 1\)。
-
-
称 \(\pm 1\pmod n\) 为 \(n\) 的平凡平方根,其他满足 \(x^2\equiv 1\pmod n\) 的为 \(n\) 的非平凡平方根。显然质数是没有非平凡平方根的,不可能拼出来 \(p\) 嘛(但 \(2\) 也没有平凡平方根!)。
-
基于此,可以设计如下算法:
-
随意取一个 \(a\),将 \(a^{n-1}\) 中的 \(n-1\) 化成 \(u2^t\) 的形式,即 \(a^{n-1}=(a^u)^{2^t}\)。
-
取 \(v=a^u\)。如果 \(a^u=1\) 则跳过本轮测试(这是显然的,因为不可能导致 \(a^{n-1}\bmod n\neq 1\),也不可能找到非平凡平方根);否则,不断将之平方,如果某一时刻 \(v\equiv -1\pmod n\) 则 break,如果不曾 break 则要么是找到了非平凡平方根,要么是根本没有通过费马素性测试,鉴定为合数。
-
-
还是很没有道理,是不是?但实际上,目前没有任何合数通过了高概率性素性测试(例如 Miller-Rabin)。通常测试轮数不应 \(\leqslant 8\),但在 OI 中因为我们有值域的限制,对 uint 以内可以用 \(2,7,61\),对 ull 可以用...你不会想背那七个关键数字的,用前十二个质数就好了。注意,如果这么做的话,不能跳过 \(a\geqslant n\) 的数而是把它们对 \(n\) 取模跑一遍(如果 \(\equiv 0\) 就跳过本轮)。
-
复杂度为 \(O(k\log)\),其中 \(k\) 为检测的轮数。但常数很大,因为在反复取模,还是对一个非 const...
-
给出示范代码。
il ull qpow(ull x,ull t,ull mod){
ull ret=1;
while(t){
if(t&1) ret=ret*x%mod;
x=x*x%mod;
t>>=1;
}
return ret;
}
il bool mlrb(ull now){
if(now<3 || !(now&1)) return now==2;
static ull a[12]={2,3,5,7,11,13,17,19,23,29,31,37};
ull an,u=now-1,v; int s,t=__builtin_ctzll(u); u>>=t;
For(i,0,12){
an=a[i]%now;
if(!an) continue;
v=qpow(an,u,now);
if(v==1) continue;
for(s=0;s<t;++s){
if(v==now-1) break;
v=v*v%now;
}
if(s==t) return false;
}
return true;
}
同余最短路
-
求 \(\sum\limits_{i=1}^n k_ia_i\) 的一些相关信息,这里 \(k_i\geqslant 0\)。所谓相关信息,可以是最大的无法构造出的数字,也可以是 \(\equiv x\pmod p\) 的数字最小能构造出的是哪个(当然,也有可能永远构造不出)。
-
如果 \(k\) 可以取负数,显然就是裴蜀定理判一下;但这里 \(k\geqslant 0\)。注意到这相当于完全背包求可达性,但这里的容量是无上限的,所以我们得人为操作它一下:不妨按 \(a\) 升序排序(重复的 \(a\) 显然可以去掉),然后将原问题转到 \(\bmod a_1\) 环境下。
-
换言之,我们考虑以 \(a_1\) 为基,讨论 \(\equiv x\pmod a_1\) 的 \(a_1\) 个剩余系中,可以构造出的最小数字是什么。显然,此时我们可以做完全背包了,复杂度 \(O(n\times a_1)\)。容易看出选哪个 \(a\) 都行,选 \(a_1\) 只是为了减小“容量上界”。
-
唔。注意到实际上我们求的是“最小数字”,故这某种意义上是一个最短路问题(一开始只有 \(\equiv 0\pmod a_1\) 的最小数字是 \(0\),其余都是 \(+\infty\)),每个剩余系是一个点,除 \(a_1\) 外,每个 \(a\) 是一类边(从每个点出发)。是不是挺像差分约束?显然上面的完全背包和 SPFA 是等价的。但这里我们没有负环,所以做 dijkstra 也是对的。
-
有时可能要微调,加一些 feature 上去。此时 dijkstra 不一定仍然可行,请结合实际情况考虑。
P3403 跳楼机
-
题意略,就是板题,且 \(n=3\),求可构造出的 \(\leqslant m\) 的数的个数。
-
直接做,复杂度 \(O(3a\log)\)。之所以不可能碰到 ll 上界而引发一些奇怪的问题,主要是因为模意义下的循环节长度最多为 \(mod\),显然很快就碰到了。另外注意 \(1\) 模 \(1\) 得 \(0\)。
P2662 牛场围栏
-
题意略。
-
显然把所有长度的木料都构造出来也就是 \(m\) 个点 \(m\) 条边,于是暴力之即可。复杂度 \(O(m^2\log)\)。
-
“先不处理木料,得到最短路后向下松弛”的思路是错误的,因为到该点的木料条数决定了可松弛距离,但条数和到这里的距离这个二元组显然缺乏严格偏序关系。
P2371 [国家集训队] 墨墨的等式
- 很符合概述中的说法的板题。切之即可,注意距离会在 \(v^2\) 级别,炸 int。
P9140 [THUPC 2023 初赛] 背包
-
题意:完全背包,\(Q\) 组询问,问体积和恰好为 \(V\) 的最大总价值,不存在合法方案则 \(-1\)。关键内容在反常的数据范围中。
-
数据范围:\(n\leqslant 50,v\leqslant 10^5,w\leqslant 10^6,Q\leqslant 10^5,V\in [10^{11},10^{12}]\)。这里 \(v\) 是容量限制,\(w\) 是价值。
-
显然很怪。尤其奇怪的是,\(V\) 是有下界的。
-
注意到同余最短路中的同余循环长度最多为 \(v\),故事实上能凑出来的所有系都一定在 \(\leqslant 10^{10}\) 的距离中被凑出来。
-
那么,是否存在合法方案是容易的。问题是最大总价值...
-
贪啊。我们选最小的 \(a\) 是为了俭省点数,这里...稍微对同余最短路的结构做以改动,改为跑到达该剩余系的最长路(隐性考虑 \(a_1\) 这条边),具体地,对每个点维护二元组 \((d,w)\),表示走到它的最短距离(最短总容量)和最大总价值,当试图松弛时,检验其和已有二元组哪个更优(即在相同 \(d\) 处谁的 \(w\) 大),由前我们知道所有解都应当在 \(10^{10}\) 以内...诶?
-
如果所有解都在 \(10^{10}\) 以内,我们就对了。但这里为了避免反复被超过,反复不优...(譬如走了 \(\frac{\operatorname{lca}(a_1,a_2)}{a_1}\) 次 \(a_2\)),我们...我们将 \(a_1\) 贪出来。放 \(\frac{w}{v}\) 最大的!故它在 \(10^{10}\) 以外一定是最优的!
-
遂得解,注意最长路只能 SPFA,理论复杂度 \(O(v\times nv)\),但显然我们这里的图是完全图,故事实上没被卡。有没有理论复杂度对的做法我就不知道了。
[ABC077D] Small Multiple
-
题意:求 \(K\) 的正整数倍的最小数位和。
-
数据范围:\(K\leqslant 10^5\)。
-
很迷惑啊。不管知不知道这道题是同余最短路,它看起来都很迷惑啊...
-
(看题解后)这什么鬼题啊...我...
-
不妨考虑十进制下的数是什么样的。显然,按每一位的位权来算非常难以接受,不妨考虑将其写成秦九韶算法的形式,于是本质不同的变换只有 \(+1\) 和 \(\times 10\)。
-
然后!把每个数字 \(\bmod K\) 的结果看成点,于是 \(+1\) 和 \(\times 10\) 是边!直接这么整会稍微有一点问题,我们顺便记录一下个位的值,不允许进位,于是总点数为 \(10K\),注意到位和的变化分别是 \(1,0\),故考虑 01bfs 实现之,问题就是 \((0,0\sim 9)\) 这个点的最短路。
-
源点应当放 \(1\),于是可以看出总复杂度应该就是点数即 \(10K\)。解决了。注意用 list 作为双端队列。