[2019 CSP冲刺]数论基础知识点复习

之前开的[数论提高题选做]大概已经咕掉了(因为完全来不及了啊qwq
考前两天赶紧复习一下我最辣鸡的数学
这篇博客是给自己复习用的,如果你要学习的话,可以参考一下这位大佬的博客。

质数/约数相关

费马小定理&欧拉定理&ex欧拉定理

费马小定理: p p p为素数, g c d ( p , a ) = 1 gcd(p,a)=1 gcd(p,a)=1,有 a p − 1 ≡ 1 (   m o d     p ) a^{p-1}≡1(\bmod \ p) ap11(mod p)
欧拉定理: g c d ( p , a ) = 1 gcd(p,a)=1 gcd(p,a)=1,有 a φ ( p ) ≡ 1 (   m o d     p ) a^{φ(p)}≡1(\bmod \ p) aφ(p)1(mod p)
ex欧拉定理:
(懒得打公式了)
[2019 CSP冲刺]数论基础知识点复习_第1张图片

逆元

没什么好说的 a − 1 ≡ 0 (   m o d     p ) a^{-1}≡0(\bmod \ p) a10(mod p),根据费马小定理,得到 a − 1 ≡ a p − 2 ≡ 0 (   m o d     p ) a^{-1}≡a^{p-2}≡0(\bmod \ p) a1ap20(mod p)

快速幂求逆元

直接写快速幂就好了。

线性递推求逆元

这东西是构造出来的。
考虑 p = k x + t p=kx+t p=kx+t,显然有 k x + t ≡ 0 (   m o d     p ) kx+t≡0(\bmod \ p) kx+t0(mod p),移项 − k × t − 1 ≡ x − 1 (   m o d     p ) -k\times t^{-1}≡x^{-1}(\bmod \ p) k×t1x1(mod p)
k k k就是 ⌊ p x ⌋ \lfloor \frac{p}{x} \rfloor xp t t t就是 p   m o d   x p \bmod x pmodx
x x x的逆元为 i n v x inv_x invx
因此 i n v x ≡ − ⌊ p x ⌋ × i n v p   m o d   x (   m o d     p ) inv_x≡-\lfloor \frac{p}{x} \rfloor \times inv_{p \bmod x}(\bmod \ p) invxxp×invpmodx(mod p)
因为负数,通常写作:
i n v x ≡ ( p − ⌊ p x ⌋ ) × i n v p   m o d   x (   m o d     p ) inv_x≡(p-\lfloor \frac{p}{x} \rfloor) \times inv_{p \bmod x}(\bmod \ p) invx(pxp)×invpmodx(mod p)

积性函数

f ( x ) f(x) f(x)是积性函数,则有 f ( a b ) = f ( a ) × f ( b ) f(ab)=f(a)\times f(b) f(ab)=f(a)×f(b) g c d ( a , b ) = 1 gcd(a,b)=1 gcd(a,b)=1
众所周知, φ ( x ) φ(x) φ(x)(欧拉函数), σ ( x ) σ(x) σ(x)(因数和函数), D ( x ) D(x) D(x)(因数个数函数), μ ( x ) \mu(x) μ(x)(莫比乌斯函数)都是积性函数。

单个计算

一般思路是将 f ( x ) f(x) f(x)变为 f ( p 1 k 1 ) × f ( p 2 k 2 ) × . . . × f ( p n k n ) f(p_1^{k_1})\times f(p_2^{k_2})\times ...\times f(p_n^{k_n}) f(p1k1)×f(p2k2)×...×f(pnkn)
然后用相应的方法处理。
下面是一些例子:

1. 欧拉函数

φ ( x ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) × . . . × φ ( p n k n ) φ(x)=φ(p_1^{k_1})\times φ(p_2^{k_2})\times ...\times φ(p_n^{k_n}) φ(x)=φ(p1k1)×φ(p2k2)×...×φ(pnkn)
定理: φ ( p k ) = p k − p k − 1 = p k − 1 ( p − 1 ) φ(p^k)=p^k-p^{k-1}=p^{k-1}(p-1) φ(pk)=pkpk1=pk1(p1) p p p为质数。
化简一下就是: φ ( x ) = n × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) × . . . × ( 1 − 1 p n ) φ(x)=n\times (1-\frac{1}{p_1})\times (1-\frac{1}{p_2})\times ...\times (1-\frac{1}{p_n}) φ(x)=n×(1p11)×(1p21)×...×(1pn1)

2.因数个数函数

应该是小学奥数内容:)
D ( x ) = ( k 1 + 1 ) × ( k 2 + 1 ) × . . . × ( k n + 1 ) D(x)=(k_1+1)\times (k_2+1)\times ...\times (k_n+1) D(x)=(k1+1)×(k2+1)×...×(kn+1)

3.因数和函数

σ ( p k ) = 1 + p 1 + p 2 + . . . + p k = p k + 1 − 1 p − 1 σ(p^k)=1+p^1+p^2+...+p^k=\frac{p^{k+1}-1}{p-1} σ(pk)=1+p1+p2+...+pk=p1pk+11
因此 σ ( x ) = p 1 k 1 + 1 − 1 p 1 − 1 × p 1 k 1 + 1 − 1 p 1 − 1 × . . . × p n k n + 1 − 1 p n − 1 σ(x)=\frac{p_1^{k_1+1}-1}{p_1-1}\times \frac{p_1^{k_1+1}-1}{p_1-1} \times ...\times \frac{p_n^{k_n+1}-1}{p_n-1} σ(x)=p11p1k1+11×p11p1k1+11×...×pn1pnkn+11

4.其他函数

可以试试用dp计算
例题:CF757E Bash Plays with Functions。

多个预处理

其实跟单个差不多,只是在做线性筛的时候按公式递推一下。
处理 D ( x ) D(x) D(x)示例:

void Prime_S(){
     
	memset(SPrime,1,sizeof(SPrime));
	SPrime[1]=0;
	D[1]=1;
	for(int i=2;i<=2000000;i++){
     
		if(SPrime[i])
		{
     Prime[++Pnum]=i;D[i]=2;}
		for(int j=1;i*Prime[j]<=2000000;j++)
		if(i%Prime[j]==0){
     
			int q=i,co=1;
			while(q%Prime[j]==0){
     
				q/=Prime[j];
				co++;
			}
			SPrime[i*Prime[j]]=0;
			D[i*Prime[j]]=D[q]*(co+1);
			break;
		}
		else{
     
			SPrime[i*Prime[j]]=0;
			D[i*Prime[j]]=D[i]*D[Prime[j]];
		}
	}
}

如果不是线性的话当然就更好写了…(不过上面那个好像也不是线性的

exGCD

普通gcd是这样的:

LL gcd(LL a,LL b){
     
	return b?gcd(b,a%b):a;
}

打CF的时候肯定__gcd最好了
现在我们要用这东西解方程 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)
对于 a = k b + t a=kb+t a=kb+t,如果我们有了 b x + t y = gcd ⁡ ( a , b ) bx+ty=\gcd(a,b) bx+ty=gcd(a,b)的一组解 ( x ′ , y ′ ) (x',y') (x,y),那么 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)的解就是 ( y ′ , x ′ − k y ′ ) (y',x'-ky') (y,xky)
其实我们只需要将 t t t带入就得出来了。
t = a − k b t=a-kb t=akb b x ′ + ( a − k b ) y ′ = gcd ⁡ ( a , b ) bx'+(a-kb)y'=\gcd(a,b) bx+(akb)y=gcd(a,b) a y ′ + b ( x ′ − k y ′ ) = gcd ⁡ ( a , b ) ay'+b(x'-ky')=\gcd(a,b) ay+b(xky)=gcd(a,b)
然后考虑一下边界情况 b = 0 b=0 b=0
这时候 a × x + 0 × y = gcd ⁡ ( a , b ) = a a\times x+0\times y=\gcd(a,b)=a a×x+0×y=gcd(a,b)=a,显然有一组解 x = 1 , y = 0 x=1,y=0 x=1,y=0
这里的 k , t k,t k,t的含义其实就是 ⌊ a b ⌋ , a   m o d   b \lfloor \frac{a}{b} \rfloor,a\bmod b ba,amodb
这种做法还可以扩展到很多东西上面(比如二维欧几里得,多项式等等),具体可以去看集训队论文。

LL exgcd(LL a,LL b,LL &x,LL &y){
     
    LL x0,y0,G;
    if(!b){
     x=1,y=0;return a;}
    G=exgcd(b,a%b,x0,y0);
    x=y0,y=x0-(a/b)*y0;
    return G;
}

当然一般情况下我们要求 a x + b y = c ax+by=c ax+by=c x x x最小整数解。
首先根据裴蜀定理,设 g = gcd ⁡ ( a , b ) g=\gcd(a,b) g=gcd(a,b),方程有解当且仅当 c ≡ 0 (   m o d     g ) c≡0(\bmod \ g) c0(mod g)
因此我们先求出 a x + b y = g ax+by=g ax+by=g的解,再将 x , y x,y x,y乘上 c g \frac{c}{g} gc
我们这样就找到了一个特解 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)
如果我们要要求最小整数解的话。
我们可以运用结论,得到
{ x = x 0 + t × b g , y = y 0 − t × a g , t ∈ Z } \{x=x_0+t\times \frac{b}{g},y=y_0-t\times \frac{a}{g},t\in \Z\} { x=x0+t×gb,y=y0t×ga,tZ}
因此最小正整数解为 ( x 0 + b g )   m o d   b g (x_0+\frac{b}{g})\bmod \frac{b}{g} (x0+gb)modgb(感性理解一下)。

中国剩余定理及其扩展

中国剩余定理

解方程
{ x ≡ a 1 (   m o d     m 1 ) x ≡ a 2 (   m o d     m 2 ) . . . x ≡ a n (   m o d     m n ) \begin{cases} x≡a_1(\bmod \ m_1) \\ x≡a_2(\bmod \ m_2) \\ ...\\ x≡a_n(\bmod \ m_n) \\ \end{cases}\\ xa1(mod m1)xa2(mod m2)...xan(mod mn)
对于 m 1 , m 2 , m 3 , . . . , m n m_1,m_2,m_3,...,m_n m1,m2,m3,...,mn两两互质的情况,我们可以尝试构造一个特解。
构造方法是:
M = ∏ i = 1 n m i M=\prod^n_{i=1}m_i M=i=1nmi, t i t_i ti满足 t i × M m i ≡ 0 (   m o d     m i ) t_i\times \frac{M}{m_i}≡0(\bmod \ m_i) ti×miM0(mod mi)
那么特解是: x 0 = ∑ i = 1 n a i × t i × M m i x_0=\sum^n_{i=1}a_i\times t_i \times \frac{M}{m_i} x0=i=1nai×ti×miM
容易发现循环节为 M M M(因为两两互质),因此通解为:
x = x 0 + k × M x=x_0+k\times M x=x0+k×M
求解 t i t_i ti时我们需要exgcd。

ex中国剩余定理

在扩展定理中, m i m_i mi就不互质了。
我们考虑从前往后将方程一个一个合并。
因此我们设 M = l c m ( m 1 , m 2 , . . . , m k − 1 ) M=lcm(m_1,m_2,...,m_{k-1}) M=lcm(m1,m2,...,mk1)
对于方程组:( a 0 a_0 a0是前面方程组的特解)
{ x ≡ a 0 (   m o d     M ) x ≡ a k (   m o d     m k ) \begin{cases} x≡a_0(\bmod \ M) \\ x≡a_k(\bmod \ m_k) \\ \end{cases}\\ { xa0(mod M)xak(mod mk)
转为不定形式:
{ x = M × p + a 0 x = m k × q + a k \begin{cases} x=M\times p+a_0 \\ x=m_k\times q +a_k\\ \end{cases}\\ { x=M×p+a0x=mk×q+ak
然后 M × p + a 0 = m k × q + a k M\times p+a_0=m_k\times q +a_k M×p+a0=mk×q+ak M × p − m k × q = a 0 − a k M\times p-m_k\times q=a_0-a_k M×pmk×q=a0ak
这就是一个不定方程求解的问题了。
g = gcd ⁡ ( M , m k ) g=\gcd(M,m_k) g=gcd(M,mk) a 0 − a k ≡ 0 (   m o d     g ) a_0-a_k≡0(\bmod \ g) a0ak0(mod g)时才有解。
然后我们就得到了 p 0 p_0 p0,然后转为最小非负整数解。
这样就有了新的解 x = M × p + a 0 x=M\times p+a_0 x=M×p+a0

原根与阶

大概不会考,暂时咕掉。

其他

1. a x + b y ( x ≥ 0 , y ≥ 0 ) ax+by(x≥0,y≥0) ax+by(x0,y0)最大不能表示的数为 a ∗ b − a − b a*b-a-b abab
具体证明可以用构造法:
[2019 CSP冲刺]数论基础知识点复习_第2张图片
[转载自:Luogu Mzwuzad大佬的题解]
2. { 0 , t , 2 t , 3 t , . . . , ( n − 1 ) t } \{ 0,t,2t,3t,...,(n-1)t \} { 0,t,2t,3t,...,(n1)t}   m o d     n \bmod \ n mod n意义下是完系的充要条件是 g c d ( t , n ) = 1 gcd(t,n)=1 gcd(t,n)=1

END

如有错误,请评论纠正。

你可能感兴趣的:(赛前冲刺)