欧拉定理 & 费马小定理

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