费马小定理:
当 \(a,p\in \mathbb{Z}\) 且 \(p\) 为质数,且 \(a\not\equiv 0\pmod{p}\) 时有:\(a^{p-1}\equiv 1\pmod{p}\)。
所以 \(a^b\equiv a^{b\bmod (p-1)}\pmod p\)。
欧拉定理:
当 \(a,m\in \mathbb{Z}\),且 \(\gcd(a,m)=1\) 时有: \(a^{\varphi(m)}\equiv 1\pmod{m}\)。
这里 \(\varphi(x)\) 是数论中的欧拉函数。
所以 \(a^b\equiv a^{b\bmod \varphi(m)}\pmod m\)。
扩展欧拉定理:
当 \(a,m\in \mathbb{Z}\) 时有:
\(a^b\equiv\left\{\begin{matrix}a^b&,b<\varphi(m)\\a^{b\bmod\varphi(m)+\varphi(m)}&,b\ge\varphi(m)\end{matrix}\right.\pmod m\)
Gcd
LL Gcd(LL x, LL y){ LL t; while(y) t = x, x = y, y = t % y; return x; }
Exgcd
对于 \(ax+by=c\) 这个式子,求出 \(x,y\).
现推比较简单:
\[\begin{aligned}
&bx'+(a\bmod b)y'=c\\
&bx'+(a-a / b\cdot b)y'=c\\
&ay'+b(x'-a/b\cdot y')=c\\
\\
&故\ x = y',\ y = x'-a/b\cdot y'
\end{aligned}
\]
void Exgcd(LL a, LL b, LL &x, LL &y){
if(!b){ x = 1, y = 0; return; }
Exgcd(b, a % b, x, y);
LL t = x; x = y, y = t - a / b * y;
}
注意事项
- 若 \(\gcd(a,b)\nmid c\),则无解。
- \(a,b,c\) 的正负无所谓,但是注意不要不要求出来是 \(ax+by=-c\)
- 函数调用求出来是 \(ax+by=\gcd(a,b)\).
CRT
咕咕咕
ExCRT
个人认为比 CRT 更加好理解和记忆。
假设有 \(n\) 个同余方程:
\[x\equiv b_1\pmod{p_1}\\
x\equiv b_2\pmod{p_2}\\
\cdots\\
x\equiv b_n\pmod{p_n}\\
\]
可以直接使用 Exgcd 将这些同余方程合并:
\[b_1+k_1p_1=b_2+k_2p_2\pmod{\rm{lcm}(p1,p2)}
\]
根据这一点,用 Exgcd 求出 \(k_1,k_2\) 即可将方程合并。
Lucas
用于模数为质数,但是较小的时候,求组合数:
\[\binom{n}{m}=\binom{n/p}{m/p}\binom{n\%p}{m\%p}
\]
当模数不是质数时,如果分解质因数,每个质因数的次数都为 \(1\),那么分开做,再用 CRT 合并即可。
否则要用到 ExLucas。
ExLucas
咕咕咕