欧拉定理 & 费马小定理

  • (a,p)=1,则 aφ(p)1(modp)
  • p为质数,(a,p)=1,则 ap11(modp)

ex_gcd

求解形如:ax+by=gcd(a,b)
由于gcd(a,b)=gcd(b,a mod b)
可以递归下去求出gcd(b,a mod b)的解。
然后gcd值相等,等式两边化成同样ax+by的形式,反推出该层的解。
通解x=x0+tb(a,b)y=y0+ta(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为质数,(p1)!p1(modp)

中国剩余定理

  • CRT
    模数间两两互质。
    M=i=1npi
    mi=M/pi
    每个数对答案累加mimi1ai
    因为乘上mi使得模除了pi以外的模数,余数都是零,也就是说对其余柿子没有影响。
    然后后面就是满足该柿子。

  • ex_CRT
    首先能想到i个柿子合并的模数为所有柿子模数的LCM,设前i个柿子合并的LCM为lcmi
    从前往后合并。若前k1个柿子求出一个解为x,通解为x+tlcmk1
    代入满足第k个柿子得:x+tlcmk1ak(modpi)
    线性同余方程组,用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时,ab=ab mod φ(p)
  • (a,p)1bφ(p) 时,ab=ab mod φ(p)+φ(p)