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})\)

二、应用

(一) 求解二元一次不定方程的特解

  1. 根据裴蜀定理判断无解 对于一个不定方程 \(ax + by = c\) 有解,当且仅当 \(c\)\(\gcd(a,b)\) 的倍数
  2. 求解 \(ax + by = \gcd(a, b)\)
  3. 将求出的解 \(* c / \gcd(a, b)\)
  4. 若求最小正整数解则在 \(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;

(二) 求解同余方程的特解

  1. 对于同余方程 \(ax \equiv c \pmod{b}\) 可以将其变形为 $$ax + by = c \pmod{b}$$
  2. 此时与(一)一致

三、习题

\(Luogu\ P2613\)

思路:

  • 在读入时便将 \(a,b,c\) 取模从而不使用高精度
  • 然后解方程即可

\(code\)

\(Luogu\ P1516\)

思路:

  • 将题目抽象成 \(x + mt = y + nt \pmod{L}\)
  • 将式子化简的 \((m- n)t \equiv y - x \pmod{L}\)
  • 解除最小整数解即可

\(code\)

\(Luogu\ P5656\)

思路:

  • 解方程
  • 求出 \(min_x,min_y\)
  • 推算出 \(max_x,max_y\)
  • 根据周期求出解的情况并输出

\(code\)

\(CF\ 710D\)

思路:

  • 根据题意得 \(a_1k' + a_2l' = b_2 - b_1\)
  • 求出方程特解
  • 根据特解求出通解 \(x = x_0 + tb_1\)
  • 带入区间化简求解

\(code\)

\(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\),令:

\[p = k \cdot i + r \]

其中:

  • \(k = \left\lfloor \frac{p}{i} \right\rfloor\)
  • \(r = p \bmod i\)

将表达式两边同时对 \(p\) 取模:

\[k \cdot i + r \equiv 0 \pmod p \]

将上式两边同时乘以 \(i^{-1} \cdot r^{-1}\) 得:

\[r \cdot i^{-1} \cdot r^{-1} \cdot (-k \cdot i \cdot i^{-1}) \cdot r^{-1} \equiv 0 \pmod p \]

化简得:

\[i^{-1} \equiv -k \cdot r^{-1} \pmod p \]

\(k = \left\lfloor \frac{p}{i} \right\rfloor\)\(r = p \bmod i\) 代入得:

\[i^{-1} \equiv -\left\lfloor \frac{p}{i} \right\rfloor \cdot (p \bmod i)^{-1} \pmod p \]

边界条件:当 \(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\)

思路:

  • 板子题,注意模数不一定为质数,不能使用费马小定理求解

\(code\)

\(Luogu\ P3811\)

思路:

  • 板子题,线性求解即可,注意卡常

\(code\)

\(Luogu\ P2265\)

思路:

  • 小学计数题,排列组合,杨辉三角都可解

\(code\)

\(Luogu\ P5431\)

思路:

  • 将所有数进行前缀积
  • 利用类似求阶乘逆元思路求出每个前缀积的逆元
  • 用当前前缀积逆元与上一个前缀积相乘得到当前逆元

\(code\)

\(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\)
  • 将每一个因子贡献相乘即可

\(code\)

\(Day 3\) 欧拉函数

一、 \(\varphi (x)\)

定义: 小于等于 \(n\) 的正整数与 \(n\) 互质的个数

性质:

  1. 对于素数 \(p\) 的幂次 \(p^{k} (k \ge 1)\)\(\varphi (p^k) = p^k - p^{k - 1} = p^{k - 1} \cdot (p - 1)\)

  2. \(a \mid x\)\(\varphi (ax) = a \cdot \varphi (x)\)

  3. \(\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)\)

\(code\)

$ UVA\ 11327$

思路:

  • 模版暴力题,线性筛出 \(\varphi (200000)\) 然后暴力累加

\(code\)

\(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})\)

\(code\)

\(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}$

\(code\)

\(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\)

思路:

  • 模版题,注意数据范围

\(code\)

\(UVA\ 756\)

思路:

  • 模版题

\(code\)

\(Luogu\ P3868\)

思路:

  • 根据题意可以列出同余方程 $ n \equiv a \pmod b $
  • 直接套模版即可

\(code\)

\(Luogu\ P2421\)

思路:

  • 观察到 \(n\) 比较小可以列出所有同余方程,然后只需找到一个最小的模数 \(m\) 使得所有方程无解即可
  • 此时可以枚举 \(m\) 对于每个 \(m\) 验证一遍如果满足就输出即可

\(code\)

\(CF\ 687B\)

思路:

  • 由题可得,x 可以用每个数表示出来
  • 推导一下可以得到结论当 \(k \mid lmc(c_1, c_2 ... , c_n)\) 时为 \(Yes\),反之为 \(No\)

\(code\)

\(Day 5\) 欧拉定理 $ && $ 扩展欧拉定理

一、 欧拉定理和扩展欧拉定理

欧拉定理: 对于整数 \(m>0\) 和整数 \(a\),且 \(\gcd(a,n)=1\),有:\(a^{\varphi(n)} \equiv 1 \pmod{n}\) 其中 \(\varphi(n)\) 表示 \(n\) 的欧拉函数

特殊情况(费马小定理) : 当 \(m\) 是质数的时候

扩展欧拉定理: 对于任意正整数 \(m\)、整数 \(a\) 和非负整数 \(k\),有:

\[a^k \equiv \begin{cases} a^k, & k < \varphi(m), \\ a^{(k \bmod \varphi(m)) + \varphi(m)} & k \ge \varphi(m) \end{cases} \pmod m \]

二、欧拉定理证明过程


\( S=\{r_1,r_2,\dots,r_{\varphi(m)}\} \)
是模 \(m\) 的一个既约剩余系,且 \(\gcd(a,m)=1\)

  1. 构造集合 \(aS\)

    \( aS=\{a r_1,a r_2,\dots,a_{\varphi(m)}\} \)

  2. 证明 \(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\)既约剩余系

  1. 两集合元素乘积同余
    既约剩余系在模 \(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 \)

  1. 约去公共乘积

    \( 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\)

思路:

  • 模版题

\(code\)

\(Luogu\ P4139\)

思路:

  • 指数的模数每次会更新为 \(\varphi(x)\)
  • 可以递归求解
  • 边界条件:当 \(\varphi(n) = 1\) 时指数为 \(0\)

\(code\)

\(CF\ 906D\)

思路:

  • 类似上一题
  • 但是在取模时候要考虑当前指数与当前模数的欧拉函数的大小关系

\(code\)

\(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\) 的特殊情况

\(code\)

\(Luogu\ P4454\)

思路:

  • 通过给出的 \(g, p, A\) 算出 \(a\)
  • 再利用 \(k = B^a\) 得出答案

\(code\)

\(Luogu\ P2485\)

思路:

  • 超级缝合怪模版题

\(code\)

posted @ 2026-02-25 15:31  mouse_boy  阅读(46)  评论(0)    收藏  举报