欧拉定理 & 费马小定理
- \((a,p)=1\),则 \(a^{\varphi(p)} \equiv 1 \pmod{p}\)
- 若\(p\)为质数,\((a,p)=1\),则 \(a^{p-1}\equiv1\pmod{p}\)
ex_gcd
求解形如:\(ax+by=gcd(a,b)\)
由于\(gcd(a,b)=gcd( b, a\ mod\ b)\)
可以递归下去求出\(gcd( b, a\ mod\ b)\)的解。
然后\(gcd\)值相等,等式两边化成同样\(ax+by\)的形式,反推出该层的解。
通解\(x=x_0+t*\frac{b}{(a,b)}\),\(y=y_0+t*\frac{a}{(a,b)}\)
点击查看代码
ll ex_gcd(ll a, ll b, ll &x, ll &y) {
if(!b) {x = 1, y = 0; return a;}
ll d = ex_gcd(b, a % b, x, y);
ll tmp = y;
y = x - a / b * y; x = tmp;
return d;
}
威尔逊定理
若\(p\)为质数,\((p-1)! \equiv p-1 \pmod{p}\)
中国剩余定理
-
CRT
模数间两两互质。
令\(M=\prod_{i=1}^{n}p_i\)
\(m_i=M/p_i\)。
每个数对答案累加\(m_i*m_i^{-1}*a_i\)。
因为乘上\(m_i\)使得模除了\(p_i\)以外的模数,余数都是零,也就是说对其余柿子没有影响。
然后后面就是满足该柿子。 -
ex_CRT
首先能想到\(i\)个柿子合并的模数为所有柿子模数的LCM,设前\(i\)个柿子合并的LCM为\(lcm_i\)。
从前往后合并。若前\(k-1\)个柿子求出一个解为\(x\),通解为\(x+t*lcm_{k-1}\)。
代入满足第\(k\)个柿子得:\(x+t*lcm_{k-1}\equiv a_k \pmod{p_i}\)
线性同余方程组,用ex_gcd解出\(t\)。
因此就得到前\(k\)个柿子的答案了。
点击查看代码
long long ex_crt() {
ll lcm = p[1], ans = a[1];
for(int i = 2; i <= n; i++) {
ll c = a[i] - ans, x, y;
ll d = ex_gcd(lcm, p[i], x, y);
ll bg = p[i] / d;
if(c % d) {return -1;}
x = x * (c / d) % bg;
ans += lcm * x;
lcm = lcm * bg;
ans = (ans % lcm + lcm) % lcm;
}
return ans;
}
扩展欧拉定理
降幂用
- \((a,p)=1\)时,\(a^b=a^{b\ mod\ \varphi(p)}\)
- \((a,p)\not=1\) 且 \(b\ge \varphi(p)\) 时,\(a^b=a^{b\ mod\ \varphi(p)+\varphi(p)}\)