同余进阶

扩展欧拉定理

\[a^b\equiv \begin{cases} a^{b \bmod \varphi(m)} & (a,m)=1\\ a^b & (a,m)\neq 1,b<\varphi(m)\\ a^{b\bmod\varphi(m)+\varphi(m)} & (a,m)\neq 1,\,b\geqslant \varphi(m) \end{cases} \pmod{m} \]

  • 应当注意不能认为总是有 \(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\) 互质。

\[\begin{cases} x \equiv b_1\ ({\rm mod}\ m_1) \\ x\equiv b_2\ ({\rm mod}\ m_2) \\ ... \\ x \equiv b_n\ ({\rm mod}\ m_n)\end{cases} \]

  • 求最小正整数解。

  • 思路:构造一组 \(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\) 互质。

\[\begin{cases} x \equiv b_1\ ({\rm mod}\ m_1) \\ x\equiv b_2\ ({\rm mod}\ m_2) \\ ... \\ x \equiv b_n\ ({\rm mod}\ m_n)\end{cases} \]

  • 原思路所需的性质根本不存在。考虑另起炉灶。

  • 尝试将方程合并。

  • \(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 作为双端队列。

posted @ 2023-01-15 10:37  未欣  阅读(37)  评论(0编辑  收藏  举报