2026寒来追梦总结
\(Day 1\) 扩展欧几里得
一、扩欧 \((exgcd)\)
用于求解不定方程 \(ax + by = \gcd(a, b)\)
推导过程:
我们对两边同时进行辗转相除可以得到
\[bx_1 + (a \mod b)y_1 = \gcd(b, a \mod b) \]则根据欧几里得定理有
\[bx_1 + (a \mod b)y_1 = ax + by \]可以解得
\[x = y_1, y = x_1 - (a / b) * y_1 \]所以可以使用递归求解
呈现:
ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b == 0) {
return x = 1, y = 0, a;
}
ll x1, y1, ans = exgcd(b, a % b, x1, y1);
return x = y1, y = x1 - y1 * (a / b), ans;
}
时间复杂度 \(O(\log{n})\)
二、应用
(一) 求解二元一次不定方程的特解
- 根据裴蜀定理判断无解 对于一个不定方程 \(ax + by = c\) 有解,当且仅当 \(c\) 为 \(\gcd(a,b)\) 的倍数
- 求解 \(ax + by = \gcd(a, b)\)
- 将求出的解 \(* c / \gcd(a, b)\)
- 若求最小正整数解则在 \(a,b / \gcd(a, b)\) 后分别将 \((x,y \mod b,a + b, a) \mod b,a\)
呈现:
d = exgcd(a, b, x, y);
if(c % d) {
cout << "-1\n";
continue;
}
a /= d, b /= d, c /= d;
minx = (x * c % b + b) % b, miny = (y * c % a + a) % a;
(二) 求解同余方程的特解
- 对于同余方程 \(ax \equiv c \pmod{b}\) 可以将其变形为 $$ax + by = c \pmod{b}$$
- 此时与(一)一致
三、习题
\(Luogu\ P2613\)
思路:
- 在读入时便将 \(a,b,c\) 取模从而不使用高精度
- 然后解方程即可
\(Luogu\ P1516\)
思路:
- 将题目抽象成 \(x + mt = y + nt \pmod{L}\)
- 将式子化简的 \((m- n)t \equiv y - x \pmod{L}\)
- 解除最小整数解即可
\(Luogu\ P5656\)
思路:
- 解方程
- 求出 \(min_x,min_y\)
- 推算出 \(max_x,max_y\)
- 根据周期求出解的情况并输出
\(CF\ 710D\)
思路:
- 根据题意得 \(a_1k' + a_2l' = b_2 - b_1\)
- 求出方程特解
- 根据特解求出通解 \(x = x_0 + tb_1\)
- 带入区间化简求解
\(Day 2\) 模意义下的乘法逆元
一、乘法逆元 \((inv)\)
定义:对于整数 \(a\) 和模数 \(p\) 若存在 \(ax \equiv 1 \pmod{p}\) 则称 \(a, x\) 在模 \(p\) 意义下互为逆元
用于在模 \(p\) 意义下的除法
逆元存在条件:$$\gcd(x, p) =1$$
二、求解方法
(一) 扩欧解同余方程
利用定义同余方程求解
优点: 可以用于所有情况,可以判断无解情况
缺点:无
单个时间复杂度 \(O(\log{n})\)
(二) 费马小定理求解
费马小定理
设 $ p $ 是素数。对于任意整数 $ a $ 且 \(p \nmid a\) ,都成立 \(a^{p-1} \equiv 1 \pmod p\)
根据费马小定理得到对于整数 \(x\) 以及素模数 \(p\) 有 $ x^{p - 2}x = x^{p - 1} \equiv 1 \pmod{p}$ ,所以得到 \(x^{-1} = x^{p - 2}\)
优点: 代码量小(仅需要快速幂)
缺点:\(p\) 必须是质数,无法判断无解情况
单个时间复杂度 \(O(\log{n})\)
(三) 线性递推求 \(n\) 以内逆元
推导过程
对于任意 \(2 \le i < p\),令:
其中:
- \(k = \left\lfloor \frac{p}{i} \right\rfloor\)
- \(r = p \bmod i\)
将表达式两边同时对 \(p\) 取模:
将上式两边同时乘以 \(i^{-1} \cdot r^{-1}\) 得:
化简得:
将 \(k = \left\lfloor \frac{p}{i} \right\rfloor\)、\(r = p \bmod i\) 代入得:
边界条件:当 \(i=1\) 时 \(1^{-1} = 1 \pmod p\)
最终公式 $$inv_i = (p - \left \lfloor \frac{p}{i} \right \rfloor ) \times inv_{p\mod i} \pmod p$$
优点: 求多个时速度快
缺点:无
线性时间复杂度 \(O(n)\)
(四) 求阶乘逆元
根据 \(x^{-1}x \equiv 1 \pmod{p}\),我们可以先求出 \({n!}^{-1}\) 然后从后往前递推得到所有阶乘的逆元
优点: 求多个时速度快
缺点:无
线性时间复杂度 \(O(n)\)
三、习题
\(Luogu\ P1082\)
思路:
- 板子题,注意模数不一定为质数,不能使用费马小定理求解
\(Luogu\ P3811\)
思路:
- 板子题,线性求解即可,注意卡常
\(Luogu\ P2265\)
思路:
- 小学计数题,排列组合,杨辉三角都可解
\(Luogu\ P5431\)
思路:
- 将所有数进行前缀积
- 利用类似求阶乘逆元思路求出每个前缀积的逆元
- 用当前前缀积逆元与上一个前缀积相乘得到当前逆元
\(Luogu\ P1593\)
思路:
- 分解 \(a\) 的所有质因数
- 设 \(a = p_1^{t_1} \cdot p_2^{t_2} \cdot ...\cdot p_k^{t_k}\)。 计算每一个因子的贡献,即 \(1 + p_i + p_i^2 + ... + p_i^{t_i \cdot b}\)。是一个等比数列,和为 \(\frac{1 - p_i^{t_i \cdot b + 1}}{1-p_i}\)。
- 当 \(1 - p_i\) 与 \(9901\) 不互质,即 \(p_i \mod 9901 = 1\)时,没有逆元。此时整个等比数列均为 \(1\),即总贡献为 \(t_i \cdot b + 1\)。
- 将每一个因子贡献相乘即可
\(Day 3\) 欧拉函数
一、 \(\varphi (x)\)
定义: 小于等于 \(n\) 的正整数与 \(n\) 互质的个数
性质:
-
对于素数 \(p\) 的幂次 \(p^{k} (k \ge 1)\) 有 \(\varphi (p^k) = p^k - p^{k - 1} = p^{k - 1} \cdot (p - 1)\)
-
若 \(a \mid x\) 则 \(\varphi (ax) = a \cdot \varphi (x)\)
-
若 \(\gcd(n,m) = 1\) 则 \(\varphi(nm) = \varphi(n) \cdot \varphi(m)\)
二、计算方法
(一) 定义法求单个数的欧拉函数
推导过程
令 \(n = p_1^{t_1} \cdot p_2^{t_2} ... p_k^{t_k}\),根据性质三有 \(\varphi(n) = \varphi(p_1^{t_1}) \cdot \varphi(p_2^{t_2}) ... \varphi(p_k^{t_2})\),再根据性质一有 \(\varphi(n) = p_1^{t_1 - 1} \cdot (p_1 - 1) \cdot p_2^{t_2 - 1} \cdot (p_2 - 1) ... p_k^{t_k - 1} \cdot (p_k - 1)\) 此时提出一个 \(n\) 可以得到 \(\varphi(n) = n \cdot \frac{(p_1 - 1) \cdot (p_2 - 1) ... (p_k - 1)}{p_1 \cdot p_2 ... p_k}\)
令 \(n = p_1^{t_1} \cdot p_2^{t_2} ... p_k^{t_k}\),\(\varphi(n) = n \cdot \frac{(p_1 - 1) \cdot (p_2 - 1) ... (p_k - 1)}{p_1 \cdot p_2 ... p_k}\)。
(二) 线性筛求
原理
每个合数仅被它最小的质因子标记从而达到线性时间复杂度
三、习题
\(UVA\ 10179\)
思路:
- 模版题根据题意化简其实就是求 \(\varphi(n)\)
$ UVA\ 11327$
思路:
- 模版暴力题,线性筛出 \(\varphi (200000)\) 然后暴力累加
\(CF\ P\)
思路:
- 两边同时除以 \(d = \gcd(a, m)\),即 \(\gcd(\frac{a}{d},\frac{m}{d}) = \gcd(\frac{a + x}{d},\frac{m}{d}) = 1\)
- 对于 \(\gcd(\frac{a + x}{d},\frac{m}{d}) = 1\) 进行辗转相除可以得到
- \(\gcd(\frac{a + x}{d},\frac{m}{d}) = \gcd(\frac{a + x}{d} \mod{m},\frac{m}{d}) = 1\)
- 令 \(\frac{a + x}{d} \mod{m} = a, \frac{m}{d} = b\)
- 所以此时 \(a, b\) 互质
- 此时考虑 \(a\) 的值域, 因为 \(x \in [0, m)\) 而 \(a\) 是模 \(b\) 意义下,所以有 \(a \in b\)
- 所以题面转化为了求 \(\varphi(\frac{m}{d})\)
\(Luogu\ P1891\)
思路:
- 先将\(\operatorname{lcm}(i, n) 转化为 \frac{n \cdot i}{\gcd(i,n)}\)
- 然后考虑枚举 \(\gcd(i,n)\) 即枚举 \(n\) 的因子
- 对于每个因子 \(d_j\) 其贡献为 \(\sum_{i \% n != 0}^{d} i\)
- 对于小于等于 \(n\) 与 \(n\) 互质的数的和就是 $ \frac{n \cdot \varphi(n)}{2}$
\(Day 4\) 扩展中国剩余定理
一、 \(exCRT\)
用于求解同余方程组
\[x \equiv a_1 \pmod {p_1} \]\[x \equiv a_2 \pmod {p_2} \]\[... \]\[x \equiv a_k \pmod {p_k} \]
二、推导过程
数学归纳法:
假设已经解出前 \(k - 1\) 个方程的一个特解 \(x_{k - 1}\), 前 \(k - 1\) 各模数的 \(lcm\) \(lcm_{k-1}\) 则通解为 \(x_{k - 1} + lca_{k-1} \cdot t\)
将通解带入第 \(k\) 个方程得到 \(x_{k-1} + lcm_{k - 1} \cdot t \equiv a_k \pmod {p_k}\)
化简得 \(lcm_{k-1} \cdot t \equiv a_k - x_{k-1}\)
此时通过扩欧求解即可,求解后更新特解 \(x\) 和 \(lcm\) 继续求解
实现:
ll exgcd(ll a, ll b, ll &x, ll &y) {// 扩欧
if(!b) return x = 1, y = 0, a;
ll x1, y1, ans = exgcd(b, a % b, x1, y1);
return x = y1, y = x1 - (a / b) * y1, ans;
}
ll h(ll a, ll b, ll c, ll &d) {// 解同余方程
ll x, y;
d = exgcd(a, b, x, y);
if(c % d) return -1;
a /= d, b /= d, c /= d;
return (x * c % b + b) % b;
}
ll excrt(ll ans = b[1] % p[1], ll k = p[1], ll x = 1) {
//对于第一个方程特解x为 a[1] % p[1], lcm = p[1];
for(ll i = 2, d; i <= n; i++) {// 求解每一个方程
b[i] = ((b[i]- ans) % p[i] + p[i]) % p[i];
if((x = h(k, p[i], b[i], d)) == -1) return -1;
ans = ans + x * k, k = k / d * p[i], ans = (ans % k + k) % k;// 更新特解x和lcm
}
return ans;
}
时间复杂度 \(O(n \log {n})\)
三、习题
\(Luogu\ P4777\)
思路:
- 模版题,注意数据范围
\(UVA\ 756\)
思路:
- 模版题
\(Luogu\ P3868\)
思路:
- 根据题意可以列出同余方程 $ n \equiv a \pmod b $
- 直接套模版即可
\(Luogu\ P2421\)
思路:
- 观察到 \(n\) 比较小可以列出所有同余方程,然后只需找到一个最小的模数 \(m\) 使得所有方程无解即可
- 此时可以枚举 \(m\) 对于每个 \(m\) 验证一遍如果满足就输出即可
\(CF\ 687B\)
思路:
- 由题可得,x 可以用每个数表示出来
- 推导一下可以得到结论当 \(k \mid lmc(c_1, c_2 ... , c_n)\) 时为 \(Yes\),反之为 \(No\)
\(Day 5\) 欧拉定理 $ && $ 扩展欧拉定理
一、 欧拉定理和扩展欧拉定理
欧拉定理: 对于整数 \(m>0\) 和整数 \(a\),且 \(\gcd(a,n)=1\),有:\(a^{\varphi(n)} \equiv 1 \pmod{n}\) 其中 \(\varphi(n)\) 表示 \(n\) 的欧拉函数
特殊情况(费马小定理) : 当 \(m\) 是质数的时候
扩展欧拉定理: 对于任意正整数 \(m\)、整数 \(a\) 和非负整数 \(k\),有:
二、欧拉定理证明过程
设
\(
S=\{r_1,r_2,\dots,r_{\varphi(m)}\}
\)
是模 \(m\) 的一个既约剩余系,且 \(\gcd(a,m)=1\)。
-
构造集合 \(aS\)
令
\( aS=\{a r_1,a r_2,\dots,a_{\varphi(m)}\} \) -
证明 \(aS\) 也是模 \(m\) 的既约剩余系
-
两两不同余
若 \(a r_i\equiv a r_j\pmod m\),由 \(\gcd(a,m)=1\),可约去 \(a\),得 \(r_i\equiv r_j\pmod m\)。
而 \(S\) 是既约剩余系,故 \(i=j\),即 \(aS\) 中元素两两不同余。 -
每个元素都与 \(m\) 互质
\(\gcd(a,m)=1,\ \gcd(r_i,m)=1\Rightarrow \gcd(a r_i,m)=1\)。
因此 \(aS\) 也是模 \(m\) 的既约剩余系。
- 两集合元素乘积同余
既约剩余系在模 \(m\) 下只是排列不同,乘积相等:
\( \prod_{i=1}^{\varphi(m)} r_i \equiv \prod_{i=1}^{\varphi(m)} (a r_i) \pmod m \)
右边提出 \(a\) 的幂:
\( \prod_{i=1}^{\varphi(m)} r_i \equiv a^{\varphi(m)}\cdot \prod_{i=1}^{\varphi(m)} r_i \pmod m \)
- 约去公共乘积
记
\( P = \prod_{i=1}^{\varphi(m)} r_i \)
每个 \(r_i\) 与 \(m\) 互质,故 \(\gcd(P,m)=1\),可在同余式两边约去 \(P\):
\( 1\equiv a^{\varphi(m)}\pmod m \)
即
\( a^{\varphi(m)}\equiv 1\pmod m \)
三、习题
\(Luogu\ P5091\)
思路:
- 模版题
\(Luogu\ P4139\)
思路:
- 指数的模数每次会更新为 \(\varphi(x)\)
- 可以递归求解
- 边界条件:当 \(\varphi(n) = 1\) 时指数为 \(0\)
\(CF\ 906D\)
思路:
- 类似上一题
- 但是在取模时候要考虑当前指数与当前模数的欧拉函数的大小关系
\(Day 6\) 大步小步算法
一、BSGS
用于求解高次同余方程 \(a^{x} \equiv b \pmod p\), 其中\(a,p\) 互质
思路:
朴素算法:根据欧拉定理,\(a\) 的幂在模 \(p\) 意义下有循环节,所以可以枚举答案,时间复杂度为 \(O(\varphi(p))\),又因为 \(p\) 为质数,时间复杂度约为 \(O(p)\)
但是当 \(p\) 较大时朴素算法很慢,此时我们可以考虑用空间来换取时间复杂度
我们令 $t = \left \lceil \sqrt p \right \rceil $, \(x = A \cdot t - B\)
将 \(x\) 带入原式并变形得到 \(a^{A \cdot t - B} = b \cdot a^ B \pmod p\)
接下来枚举 \(B \in \left [ 0,t \right )\), 将 \(b \cdot a^B\) 存在哈希表中,此步时间复杂度 \(O(t)\)
最后枚举 $ A \in \left [ 1,t \right ] \(, 计算\)a{tA}$,如果在哈希表中出现,则有解 \(x = A\cdot t - B\),此步时间复杂度 \(O(t)\)
如果最后都没有找到则无解
时间复杂度: \(O(\sqrt {p})\)
实现:
ll bsgs(ll a, ll b, ll mod) {
b = b % mod;
ll t = sqrt(mod) + 1, v = b;
for(ll i = 0; i <= t; mp[v] = ++i, v = v * a % mod) ;
v = a = qpow(a, t, mod);
for(ll i = 1; i <= t; i++) {
if(mp[v]) {
return (i * t - mp[v] + 1 + mod) % mod;
}
v = v * a % mod;
}
return -1;
}
二、exBSGS
用于求解高次同余方程 \(a^{x} \equiv b \pmod p\), 不要求 \(a,p\) 互质
思路:
先将方程转化为不定方程 \(a^{x} + p \cdot y = b\)
提出一个 \(a\) 得到 \(a \cdot a^{x - 1} + p \cdot y = b\)
令 \(d = \gcd(a, p)\),使用裴蜀定理判断是否无解,若有解继续往下
将方程两边同时除 \(d\) 得到 \(\frac{a}{d} \cdot a^{x - 1} + \frac{p}{d} \cdot y = \frac{b}{d}\)
再将不定方程转化为同余方程得到 \(\frac{a}{d} \cdot a^{x - 1} \equiv \frac{b}{d} \pmod{\frac{p}{d}}\)
化简得到 \(a^{x - 1} \equiv \frac{b}{d} \cdot {\frac{a}{d}} ^{-1} \pmod{\frac{p}{d}}\)
重复以上步骤直至证明无解或 \(a,p\) 互质
使用BSGS求解,最后答案需要加上转变次数
三、习题
\(Luogu\ P3546\)
思路:
- 模版题,注意 \(b = 1\) 的特殊情况
\(Luogu\ P4454\)
思路:
- 通过给出的 \(g, p, A\) 算出 \(a\)
- 再利用 \(k = B^a\) 得出答案
\(Luogu\ P2485\)
思路:
- 超级缝合怪模版题

浙公网安备 33010602011771号