2.2 数学知识1

一、素数

1.素数计数函数

素数计数函数记为 π ( x ) \pi(x) π(x),表示小于等于 x x x的素数的个数,即:

π ( x ) = { n ∣ n ≤ x 且 n 为 素 数 } \pi(x)=\{n|n\leq x且n为素数\} π(x)={nnxn}

素数定理:当 x x x很大时, π ( x ) \pi(x) π(x)近似等于 x ln ⁡ x \frac{x}{\ln x} lnxx,即:

lim ⁡ x → + ∞ π ( x ) = x ln ⁡ x \lim_{x\to+\infty}\pi(x)=\frac{x}{\ln x} x+limπ(x)=lnxx

2.唯一分解定理与标准分解式

唯一分解定理:对于自然数 N > 1 N>1 N>1,如果 N N N不为质数,那么 N N N可以唯一分解成有限个质数的乘积,即:

N = ∏ i = 1 k a i p i N=\prod^k_{i=1}{a_i}^{p_i} N=i=1kaipi

这样的分解称为标准分解式

3.Eratosthenes筛法

基本思想:任意整数 x x x的倍数都不是质数

对于每个数 x x x,只需要从 x 2 x^2 x2开始标记

时间复杂度 O ( n log ⁡ log ⁡ n ) O(n\log \log n) O(nloglogn)

int primes[N],cnt;
bool st[N];
void get_primes(int n){
	for(int i=2;i<=n;i++){
		if(!st[i]){
			primes[cnt++]=i;
			for(int j=i;j<=n/i;j++)
				st[j*i]=true;
		}
	}
}

4.线性筛法

基本思想:在每个数的最小质因子处标记

时间复杂度 O ( n ) O(n) O(n)

int primes[N],cnt;
bool st[N];
void get_primes(int n){
	for(int i=2;i<=n;i++){
		if(!st[i]) primes[cnt++]=i;
		for(int j=0;primes[j]<=n/i;j++){
			st[primes[j]*i]=true;
			if(i%primes[j]==0) break;
		}
	}
}

二、因数

1.因数的一些基本常识

在这里插入图片描述

  • 16 16 16个质数乘积 > 1 0 18 >10^{18} >1018

2.分解质因数

枚举 2 2 2~ n \sqrt n n ,分解结果为 ∏ p i k i \prod {p_i}^{k_i} piki

int primes[N],k[N];
void divide(int n){
	for(int i=2;i<=n/i;i++)
		if(n%i==0){
			int s=0;
			while(n%i==0){
				n/=i;
				s++;
			}
			primes[++cnt]=i;
			k[cnt]=s;
		}
	if(n>1){
		primes[++cnt]=n;
		k[cnt]=1;
	}
}

3.枚举所有因数

在分解质因数的基础上可以达到 O ( O( O(因数个数 ) ) )

int divisors[N],primes[N],k[N];
int cntprime,cntdiv;
void dfs(int p,int s){
	if(p>cntp){
		divisors[++cnt]=s;
		return;
	}
	for(int i=0;i<=k[p];i++){
		dfs(p+1,s);
		s*=primes[p];
	} 
}

三、剩余系运算

1.取模(mod)

概念:求两个数相除的余数

基本运算:

( a + b ) % p = ( a % p + b % p ) % p (a+b)\%p=(a\%p+b\%p)\%p (a+b)%p=(a%p+b%p)%p
( a − b ) % p = ( a % p − b % p ) % p (a-b)\%p=(a\%p-b\%p)\%p (ab)%p=(a%pb%p)%p
( a × b ) % p = ( a % p × b % p ) % p (a\times b)\%p=(a\%p\times b\%p)\%p (a×b)%p=(a%p×b%p)%p
( a b ) % p = ( ( a % p ) b ) % p (a^b)\%p=((a\%p)^b)\%p (ab)%p=((a%p)b)%p

除法利用逆元计算

a ÷ b = a × b − 1   ( m o d   p ) a\div b=a\times b^{-1}\space (mod\space p) a÷b=a×b1 (mod p)

2.快速幂

a b % p a^b\%p ab%p

运用二进制拆分思想 O ( log ⁡ b ) O(\log b) O(logb)

int qpow(int a,int b,int p){
	int res=1%p;//防止qpow(1,0,1)时出错
	while(b){
		if(b&1)	res=(ll)res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}

3.欧几里得算法(GCD)

int gcd(int a,int b){
	if(b==0) return a;
	return gcd(b,a%b);
}

4.最小公倍数

l c m ( a , b ) = a b g c d ( a , b ) lcm(a,b)=\frac{ab}{gcd(a,b)} lcm(a,b)=gcd(a,b)ab

可以用欧几里得算法求 g c d ( a , b ) gcd(a,b) gcd(a,b)后求 l c m ( a , b ) lcm(a,b) lcm(a,b)

5.扩展欧几里得算法(EXGCD)

常用于求 a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)的一组可行解 ( x , y ) (x,y) (x,y)
证明:

根据裴蜀定理,可以找到 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2使得

{ a x 1 + b y 1 = g c d ( a , b ) b x 2 + ( a − b ⌊ a b ⌋ ) y 2 = g c d ( b , a − b ⌊ a b ⌋ ) \begin{cases} ax_1+by_1=gcd(a,b)\\ bx_2+(a-b\lfloor\frac{a}{b}\rfloor)y_2=gcd(b,a-b\lfloor\frac{a}{b}\rfloor)\\ \end{cases} {ax1+by1=gcd(a,b)bx2+(abba)y2=gcd(b,abba)

成立,根据欧几里得算法,这两个式子右侧是相等的,则有:

a x 1 + b y 1 = b x 2 + ( a − b ⌊ a b ⌋ ) y 2 ax_1+by_1=bx_2+(a-b\lfloor\frac{a}{b}\rfloor)y_2 ax1+by1=bx2+(abba)y2

整理得:

a ( x 1 − y 2 ) + b [ y 1 − ( x 2 − ⌊ a b ⌋ y 2 ) ] = 0 a(x_1-y_2)+b[y_1-(x_2-\lfloor\frac{a}{b}\rfloor y_2)]=0 a(x1y2)+b[y1(x2bay2)]=0

我们希望等式对于任意 a , b a,b a,b都成立,则有:

x 1 = y 2 , y 1 = ( x 2 − ⌊ a b ⌋ y 2 ) x_1=y_2,y_1=(x_2-\lfloor\frac{a}{b}\rfloor y_2) x1=y2,y1=(x2bay2)

这样,求解 x 1 , y 1 x_1,y_1 x1,y1,只需求解 x 2 , y 2 x_2,y_2 x2,y2,所以可以进行递归,下面寻找边界条件。

不难发现当 b = 0 b=0 b=0时,一组解为 x = 1 , y = 0 x=1,y=0 x=1,y=0.

int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

6.Stein算法

用于处理高精度 g c d gcd gcd

当两个数同为偶数时,cnt++,任意一个为偶数时,这个数除以 2 2 2,同为奇数时,采取更相减损术,最终结果为 2 c n t ⋅ a 2^{cnt}\cdot a 2cnta a a a为剩下的数)

7.费马小定理

a p = a a^p=a ap=a ( m o d (mod (mod p ) p) p)

8.剩余系求逆元

对于某个 a a a,是否存在 b b b,使得 a b = 1 ab=1 ab=1 ( m o d (mod (mod p ) p) p)

存在性:当且仅当 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1时有逆元

证明:考虑 a x + p y = 1 ax+py=1 ax+py=1的解

唯一性:逆元若存在,一定唯一

法一:费马小定理

要求 p p p为质数

a ⋅ a p − 2 = 1 a\cdot a^{p-2}=1 aap2=1 ( m o d (mod (mod p ) p) p)

逆元即为 a p − 2 a^{p-2} ap2

法二:EXGCD

考虑求 a x + m y = 1 ax+my=1 ax+my=1的解

法三:线性求逆元1

求出 1 , 2 , ⋯   , n 1,2,\cdots,n 1,2,,n中每个数关于 p p p的逆元

首先: 1 − 1 = 1   ( m o d   p ) 1^{-1}=1\space(mod\space p) 11=1 (mod p)

其次对于所求的 i − 1 i^{-1} i1,我们设:

p = k ⋅ i + r   ( 1 < r < i < p ) p=k\cdot i+r\space(1<r<i<p) p=ki+r (1<r<i<p)

再把这个式子放到 m o d   p mod\space p mod p意义下我们可以得到:

k ⋅ i + r = 0   ( m o d   p ) k\cdot i+r=0\space (mod\space p) ki+r=0 (mod p)

两边同时乘 i − 1 ∗ r − 1 i^{-1}*r^{-1} i1r1可以得到:

k ⋅ r − 1 + i − 1 = 0   ( m o d   p ) k\cdot r^{-1}+i^{-1}=0\space(mod\space p) kr1+i1=0 (mod p)

化简得:

i − 1 = − k ⋅ r − 1 = − ⌊ p i ⌋ ⋅ ( p   m o d   i ) − 1   ( m o d   p ) i^{-1}=-k\cdot r^{-1}=-\lfloor\frac{p}{i}\rfloor\cdot (p\space mod\space i)^{-1}\space(mod\space p) i1=kr1=ip(p mod i)1 (mod p)

1 1 1~ n n n m o d   p mod\space p mod p意义下的逆元:

int inv[N];
void inverse(int n,int p){
	inv[1]=1;
	for(int i=2;i<=n;i++)
		inv[i]=(LL)(p-p/i)*inv[p%i]%p;
}

法四:线性求逆元2

上面的方法只能求出 1 , 2 , ⋯   , n 1,2,\cdots,n 1,2,,n的逆元,而不能求给定任意 n n n个数的逆元

求给定任意 n n n个数 ( 1 < a i < p ) (1<a_i<p) (1<ai<p)的逆元方法如下:

  1. 计算 n n n个数 m o d   p mod\space p mod p意义下的前缀积,记为 s i s_i si
  2. 使用扩展欧几里得算法或者快速幂求出 s n s_n sn的逆元,记作 s v n sv_n svn
  3. 由于 s v n sv_n svn n n n个数前缀积的逆元,所以 s v n sv_n svn也是 n n n个数逆元的前缀积,当我们把 s v n sv_n svn再乘上 a n a_n an时,就会与 a n a_n an的逆元抵消,变为前 n − 1 n-1 n1个数逆元的前缀积,记为 s v n − 1 sv_{n-1} svn1
  4. 同理进行如上 n − 1 n-1 n1次迭代,就能得到每个数逆元的前缀积,记为 s v i sv_i svi
  5. 最后每个数的逆元就可以用 s i − 1 ⋅ s v i   m o d   p s_{i-1}\cdot sv_i\space mod \space p si1svi mod p求得

时间复杂度 O ( n + log ⁡ p ) O(n+\log p) O(n+logp)

int n,p;
int a[N],s[N],sv[N],inv[N];
void inverse(){
	s[0]=1;
	for(int i=1;i<=n;i++)
		s[i]=a[i]*s[i-1]%p;
	sv[n]=qpow(s[n],p-2,p);//快速幂
	for(int i=n-1;i>=1;i--)
		sv[i]=sv[i+1]*a[i+1]%p;
	for(int i=1;i<=n;i++)
		inv[i]=sv[i]*s[i-1]%p;
}

9.中国剩余定理(CRT)

对于以下线性同余方程组:

{ x = b 1   ( m o d   a 1 ) x = b 2   ( m o d   a 2 ) ⋮ x = b n   ( m o d   a n ) \begin{cases} x=b_1\space(mod\space a_1)\\ x=b_2\space(mod\space a_2)\\ \vdots\\ x=b_n\space(mod\space a_n)\\ \end{cases} x=b1 (mod a1)x=b2 (mod a2)x=bn (mod an)

其中所有 a i a_i ai互质,求 x x x

显然有无数解,且所有解都是由最小的正解 a + k ⋅ l c m ( a 1 , a 2 , ⋯   , a n ) a+k\cdot lcm(a_1,a_2,\cdots,a_n) a+klcm(a1,a2,,an)得到

那么最小的正解 a a a怎么求呢?

结论:在 l c m ( a 1 , a 2 , ⋯   , a n ) lcm(a_1,a_2,\cdots,a_n) lcm(a1,a2,,an)的剩余系下,有唯一解:

∑ i = 1 n b i ⋅ M i ⋅ M i − 1 \sum_{i=1}^nb_i\cdot M_i\cdot {M_i}^{-1} i=1nbiMiMi1

其中, M i = ∏ j ≠ i a j M_i=\prod_{j\neq i} a_j Mi=j=iaj M i − 1 {M_i}^{-1} Mi1 M i M_i Mi m o d   a i mod\space a_i mod ai意义下的逆元

证明(不如说是理解):以三个线性同余方程为例,根据上方结论可得以下结果:

x = b 1 ⋅ a 2 a 3 ⋅ ( a 2 a 3 ) − 1 + b 2 ⋅ a 1 a 3 ⋅ ( a 1 a 3 ) − 1 + b 3 ⋅ a 1 a 2 ⋅ ( a 1 a 2 ) − 1 x=b_1\cdot a_2a_3\cdot (a_2a_3)^{-1}+b_2\cdot a_1a_3\cdot (a_1a_3)^{-1}+b_3\cdot a_1a_2\cdot (a_1a_2)^{-1} x=b1a2a3(a2a3)1+b2a1a3(a1a3)1+b3a1a2(a1a2)1

因为 x x x的第 2 , 3 2,3 2,3项含有因数 a 1 a_1 a1,则有:

x = b 1 ⋅ a 2 a 3 ⋅ ( a 2 a 3 ) − 1   ( m o d   a 1 ) x=b_1\cdot a_2a_3\cdot (a_2a_3)^{-1}\space (mod\space a_1) x=b1a2a3(a2a3)1 (mod a1)

又因为 ( a 2 a 3 ) − 1 (a_2a_3)^{-1} (a2a3)1恰好是在 m o d   a 1 mod\space a_1 mod a1意义下的逆元,则有:

a 2 a 3 ⋅ ( a 2 a 3 ) − 1 = 1   ( m o d   a 1 ) a_2a_3\cdot(a_2a_3)^{-1}=1\space(mod\space a_1) a2a3(a2a3)1=1 (mod a1)

因此可得:

x = b 1   ( m o d   a 1 ) x=b_1\space(mod\space a_1) x=b1 (mod a1)

同理易证得:

{ x = b 2   ( m o d   a 2 ) x = b 3   ( m o d   a 3 ) \begin{cases} x=b_2\space(mod\space a_2)\\ x=b_3\space(mod\space a_3)\\ \end{cases} {x=b2 (mod a2)x=b3 (mod a3)

由上述方法可知,我们在 l c m ( a 1 , a 2 , ⋯   , a n ) lcm(a_1,a_2,\cdots,a_n) lcm(a1,a2,,an)的剩余系内找到了唯一解 x x x

10.扩展中国剩余定理(EXCRT)

对于以下线性同余方程组

{ x = b 1   ( m o d   a 1 ) x = b 2   ( m o d   a 2 ) ⋮ x = b n   ( m o d   a n ) \begin{cases} x=b_1\space(mod\space a_1)\\ x=b_2\space(mod\space a_2)\\ \vdots\\ x=b_n\space(mod\space a_n)\\ \end{cases} x=b1 (mod a1)x=b2 (mod a2)x=bn (mod an)

其中 a i a_i ai可能不互质,求 x x x

注意:当 a i a_i ai不互质时,可能无解。

解决方法:将线性同余方程两两合并

考虑两个式子:

{ x = b 1   ( m o d   a 1 ) x = b 2   ( m o d   a 2 ) \begin{cases} x=b_1\space(mod\space a_1)\\ x=b_2\space(mod\space a_2)\\ \end{cases} {x=b1 (mod a1)x=b2 (mod a2)

我们将其改写为:

{ x = a 1 k 1 + b 1 x = a 2 k 2 + b 2 \begin{cases} x=a_1k_1+b_1\\ x=a_2k_2+b_2\\ \end{cases} {x=a1k1+b1x=a2k2+b2

则有:

a 1 k 1 + b 1 = a 2 k 2 + b 2 a_1k_1+b_1=a_2k_2+b_2 a1k1+b1=a2k2+b2

移项得:

a 1 k 1 + a 2 k 2 = b 2 − b 1 a_1k_1+a_2k_2=b_2-b_1 a1k1+a2k2=b2b1

注意:我们这里将负号给了 k 2 k_2 k2,中间用加号连接。

我们可以利用 e x g c d exgcd exgcd得到 a 1 k 1 + a 2 k 2 = g c d ( a 1 , a 2 ) a_1k_1+a_2k_2=gcd(a_1,a_2) a1k1+a2k2=gcd(a1,a2)的一组解,此时若想让原方程有解,只需 g c d ( a 1 , a 2 ) ∣ ( b 2 − b 1 ) gcd(a_1,a_2)\mid(b_2-b_1) gcd(a1,a2)(b2b1),此时方程的一组解为 e x g c d exgcd exgcd的解分别乘 b 2 − b 1 g c d ( a 1 , a 2 ) \frac{b_2-b_1}{gcd(a_1,a_2)} gcd(a1,a2)b2b1

解出 k 1 , k 2 k_1,k_2 k1,k2后,再将其代回,得到 x x x,那么这两个同余方程就可以合并成一个同余方程:

x = x 0   ( m o d   l c m ( a 1 , a 2 ) ) x=x_0\space(mod\space lcm(a_1,a_2)) x=x0 (mod lcm(a1,a2))

注意:这里的 x 0 x_0 x0为上面的两个同余方程解出的最小的正解 x x x

根据上述方法进行 n − 1 n-1 n1次合并,若出现 g c d ( a 1 , a 2 ) ∤ ( b 2 − b 1 ) gcd(a_1,a_2)\nmid (b_2-b_1) gcd(a1,a2)(b2b1),则证明方程组无解,若没有出现以上情况,则原线性同余方程组的解为最终合并成一个同余方程后的 x 0 x_0 x0

四、欧拉函数相关

1.定义

表示小于等于 n n n的与 n n n互质的数的个数,记作 ϕ ( n ) \phi(n) ϕ(n)

欧拉函数是积性函数

2.相关公式

(1) ϕ ( m n ) = ϕ ( m ) ϕ ( n )   ( g c d ( m , n ) = 1 ) \phi(mn)=\phi(m)\phi(n)\space(gcd(m,n)=1) ϕ(mn)=ϕ(m)ϕ(n) (gcd(m,n)=1)(此处为积型函数性质)

证明:

考虑构造两个集合使得两个集合的理论大小分别为 ϕ ( m n ) \phi(mn) ϕ(mn) ϕ ( m ) ϕ ( n ) \phi(m)\phi(n) ϕ(m)ϕ(n),构造如下:

A = { x ∣ g c d ( x , m n ) = 1 } B = { ( a , b ) ∣ g c d ( a , m ) = 1 , g c d ( b , n ) = 1 } A=\{x\mid gcd(x,mn)=1\}\\ B=\{(a,b)\mid gcd(a,m)=1,gcd(b,n)=1\}\\ A={xgcd(x,mn)=1}B={(a,b)gcd(a,m)=1,gcd(b,n)=1}

此时只需证明两个集合等势(大小相等)即可

证明等势分为两步:

  1. ∀ a 1 , a 2 ∈ A , a 1 ≠ a 2 , f ( a 1 ) ≠ f ( a 2 ) \forall a_1,a_2\in A,a_1\neq a_2,f(a_1)\neq f(a_2) a1,a2A,a1=a2,f(a1)=f(a2) 由此可推出 s i z e ( A ) ≤ s i z e ( B ) size(A)\leq size(B) size(A)size(B)
  2. ∀ b ∈ B , ∃ a ∈ A , f ( a ) = b \forall b\in B,\exists a\in A,f(a)=b bB,aA,f(a)=b 由此可推出 s i z e ( B ) ≤ s i z e ( A ) size(B)\leq size(A) size(B)size(A)

注意:这里 f f f只是对应函数,无实际意义。

从而可以得到两个集合等势

证明 ( 1 ) (1) (1)如下:

利用反证法,若 ( 1 ) (1) (1)不成立,任取 x 1 , x 2 ∈ A x_1,x_2\in A x1,x2A且满足 ( 1 ) (1) (1)条件,则 x 1 , x 2 x_1,x_2 x1,x2对应到集合 B B B中的数对分别为:

( x 1   m o d   m , x 1   m o d   n ) , ( x 2   m o d   m , x 2   m o d   n ) (x_1\space mod \space m,x_1\space mod \space n),(x_2\space mod \space m,x_2\space mod \space n) (x1 mod m,x1 mod n),(x2 mod m,x2 mod n)

令数对第一维为 y 1 y_1 y1,第二维为 y 2 y_2 y2,可以构造出如下同余方程组:

{ x = y 1   ( m o d   m ) x = y 2   ( m o d   n ) \begin{cases} x=y_1\space(mod\space m)\\ x=y_2\space(mod\space n)\\ \end{cases} {x=y1 (mod m)x=y2 (mod n)

根据中国剩余定理可知,方程组有唯一确定的 x ≤ l c m ( m , n ) x\leq lcm(m,n) xlcm(m,n),故假设不成立, ( 1 ) (1) (1)成立

证明 ( 2 ) (2) (2)如下:

∀ ( a , b ) ∈ B \forall (a,b)\in B (a,b)B,对应到集合 A A A的数应满足:

{ x = a   ( m o d   m ) x = b   ( m o d   n ) \begin{cases} x=a\space(mod\space m)\\ x=b\space(mod\space n)\\ \end{cases} {x=a (mod m)x=b (mod n)

同理可得方程组有唯一确定的 x ≤ l c m ( m , n ) x\leq lcm(m,n) xlcm(m,n),故 ( 2 ) (2) (2)成立

从而我们得到集合 A A A与集合 B B B等势,从而证明 ϕ ( m n ) = ϕ ( m ) ϕ ( n )   ( g c d ( m , n ) = 1 ) \phi(mn)=\phi(m)\phi(n)\space(gcd(m,n)=1) ϕ(mn)=ϕ(m)ϕ(n) (gcd(m,n)=1)

(2) n = ∑ d ∣ n ϕ ( d ) n=\sum_{d|n}\phi(d) n=dnϕ(d)

简单证明:

n = 8 n=8 n=8为例,作出如下数列:

1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 \begin{matrix} \frac{1}{8}&\frac{2}{8}&\frac{3}{8}&\frac{4}{8}&\frac{5}{8}&\frac{6}{8}&\frac{7}{8}&\frac{8}{8}&\\ \end{matrix} 8182838485868788

将分数化简,并按分母相同排在同一行,删去非最简分数后可得:

1 8 3 8 5 8 7 8 1 4 3 4 1 2 1 1 \begin{matrix} \frac{1}{8}&&\frac{3}{8}&&\frac{5}{8}&&\frac{7}{8}&&\\ &\frac{1}{4}&&&&\frac{3}{4}&&&\\ &&&\frac{1}{2}&&&&&\\ &&&&&&&\frac{1}{1}&\\ \end{matrix} 8141832185438711

我们发现,各行的分母为整数 n n n互不相同的因数 d i d_i di,且分母为 d i d_i di的一行的所有分子 a i a_i ai恰好满足 g c d ( a i , d i ) = 1 gcd(a_i,d_i)=1 gcd(ai,di)=1,所以分母为 d i d_i di的一行恰好包含 ϕ ( d i ) \phi(d_i) ϕ(di)个最简分数,又因为在一开始的数列中,未化简的分数有 n n n个,从而可以推出: n = ∑ d ∣ n ϕ ( d ) n=\sum_{d|n}\phi(d) n=dnϕ(d)

(3) a ϕ ( n ) = 1   ( m o d   n )   ( g c d ( a , n ) = 1 ) a^{\phi(n)}=1\space(mod\space n)\space(gcd(a,n)=1) aϕ(n)=1 (mod n) (gcd(a,n)=1)

注:本条为欧拉定理

(4) ϕ ( p k ) = p k − p k − 1   ( p \phi(p^k)=p^k-p^{k-1}\space(p ϕ(pk)=pkpk1 (p为质数 ) ) )

3.求欧拉函数的值

ϕ ( n ) = n ∏ i = 1 s ( 1 − 1 p i ) \phi(n)=n\prod^{s}_{i=1}({1-\frac{1}{p_i}}) ϕ(n)=ni=1s(1pi1)

推导方法:利用容斥原理

int phi(int n){
	int ans=n;
	for(int i=2;i<=n/i;i++)
		if(n%i==0){
			ans=ans/i*(i-1);
			while(n%i==0) n/=i;
		}
	if(n>1) ans=ans/n*(n-1);
	return ans;
} 

4.扩展欧拉定理

a b   m o d   p = { a b   m o d   ϕ ( p ) , g c d ( a , p ) = 1 a b , g c d ( a , p ) ≠ 1 , b ≤ ϕ ( p ) a ( b   m o d   ϕ ( p ) ) + ϕ ( p ) , g c d ( a , p ) ≠ 1 , b ≥ ϕ ( p ) a^b\space mod\space p= \begin{cases} a^{b\space mod \space\phi(p)},&gcd(a,p)=1\\ a^b,&gcd(a,p)\neq1,b\leq \phi(p)\\ a^{(b\space mod\space\phi(p))+\phi(p)},&gcd(a,p)\neq1,b\geq \phi(p)\\ \end{cases} ab mod p=ab mod ϕ(p),ab,a(b mod ϕ(p))+ϕ(p),gcd(a,p)=1gcd(a,p)=1,bϕ(p)gcd(a,p)=1,bϕ(p)

五、组合数学

1.排列数

n n n个不同元素中,任取 m m m个元素的所有排列的个数,用符号 A n m A_n^m Anm表示

A n m = n ! ( n − m ) ! A_n^m=\frac{n!}{(n-m)!} Anm=(nm)!n!

2.组合数

n n n个不同元素中,任取 m m m个元素的所有组合的个数,用符号 C n m C_n^m Cnm ( n m ) \begin{pmatrix}n\\m\end{pmatrix} (nm)表示

( n m ) = C n m = A n m m ! = n ! m ! ( n − m ) ! \begin{pmatrix}n\\m\end{pmatrix}=C_n^m=\frac{A_n^m}{m!}=\frac{n!}{m!(n-m)!} (nm)=Cnm=m!Anm=m!(nm)!n!

在所有排列中,每个组合都有 m ! m! m!

3.二项式定理

( a + b ) n = ∑ i = 0 n ( n i ) a n − i b i (a+b)^n=\sum_{i=0}^n\begin{pmatrix}n\\i\end{pmatrix}a^{n-i}b^i (a+b)n=i=0n(ni)anibi

4.多重全排列问题

引入:从 n n n个物品(其中含 a i a_i ai个物品 i i i)中选择 m m m个物品,有多少种方案?

思路:把 n n n个物品当作互不相同,排列方式有 n ! n! n!种,又因为每个物品出现 a i ! a_i! ai!次重复,结果即为:

n ! ∏ a i ! \frac{n!}{\prod a_i!} ai!n!

5.整数划分问题

引入:有 n n n个球,把它们放在 m m m个盒子中,使得每个盒子都不空,有多少种分法?

思路:将 m − 1 m-1 m1个板放在 n − 1 n-1 n1个空隙中,结果为 ( n − 1 m − 1 ) \begin{pmatrix}n-1\\m-1\end{pmatrix} (n1m1)

拓展:如果可以有空盒子呢?

思路 1 1 1:可以将两个板放在同一个空隙中

思路 2 2 2:将问题转化为 n + m n+m n+m个球放在 m m m个盒子中,每个盒子都不空,结果为 ( n + m − 1 m − 1 ) \begin{pmatrix}n+m-1\\m-1\end{pmatrix} (n+m1m1)

例题: x 1 + x 2 + ⋯ + x k = r x_1+x_2+\cdots+x_k=r x1+x2++xk=r的非负整数解的数目:

( r + k − 1 k − 1 ) \begin{pmatrix}r+k-1\\k-1\end{pmatrix} (r+k1k1)

6.第二类斯特林数

n n n个物品划分成 k k k个非空的没有区别的集合的方案数。

递推公式为:

S 2 ( i , j ) = S 2 ( i − 1 , j ) ⋅ j + S 2 ( i − 1 , j − 1 ) S2(i,j)=S2(i-1,j)\cdot j+S2(i-1,j-1) S2(i,j)=S2(i1,j)j+S2(i1,j1)

通项公式:

S 2 ( n , m ) = 1 m ! ⋅ ∑ k = 0 m ( − 1 ) k ( m k ) ( m − k ) n S2(n,m)=\frac{1}{m!}\cdot \sum_{k=0}^m(-1)^k\begin{pmatrix}m\\k\end{pmatrix}(m-k)^n S2(n,m)=m!1k=0m(1)k(mk)(mk)n

7.贝尔数

第二类斯特林数第二维前缀和,即:

B n = ∑ k = 1 n S 2 ( n , k ) B_n=\sum_{k=1}^nS2(n,k) Bn=k=1nS2(n,k)

递推公式:

B n + 1 = ∑ k = 0 n ( n k ) B k B_{n+1}=\sum_{k=0}^n\begin{pmatrix}n\\k\end{pmatrix}B_k Bn+1=k=0n(nk)Bk

即枚举包含最后一个元素的集合大小

8.Lucas定理

求组合数(模较小质数)

公式:

( n m ) m o d   p = ( ⌊ n p ⌋ ⌊ m p ⌋ ) ( n   m o d   p m   m o d   p ) m o d   p \begin{pmatrix}n\\m\end{pmatrix}mod\space p=\begin{pmatrix}\lfloor\frac{n}{p}\rfloor\\\lfloor\frac{m}{p}\rfloor\end{pmatrix}\begin{pmatrix}n\space mod \space p\\m\space mod \space p\end{pmatrix}mod\space p (nm)mod p=(pnpm)(n mod pm mod p)mod p

前者进行递归,后者可以预处理出阶乘

9.扩展Lucas定理

p p p不为质数时,往往使用中国剩余定理将问题转化为模质数次幂,最后合并

l u c a s ( n , p k ) = l u c a s ( ⌊ n p ⌋ , p k ) B p k − 1 ⌊ n p k ⌋ B n   m o d   p k lucas(n,p^k)=lucas(\lfloor\frac{n}{p}\rfloor,p^k)B^{\lfloor\frac{n}{p^k}\rfloor}_{p^k-1}B_{n\space mod \space p^k} lucas(n,pk)=lucas(pn,pk)Bpk1pknBn mod pk

六、莫比乌斯反演

(以下为 1.30 数学知识 补充笔记)

1.前置知识

(1)一些引理

引理1:

⌊ a b c ⌋ = ⌊ ⌊ a b ⌋ c ⌋ \lfloor\frac{a}{bc}\rfloor=\lfloor\frac{\lfloor\frac{a}{b}\rfloor}{c}\rfloor bca=cba

引理2:

对于任意 n , d ∈ Z n,d\in \Z n,dZ ⌊ n d ⌋ \lfloor\frac{n}{d}\rfloor dn的取值最多 2 n 2\sqrt{n} 2n

(2)数论分块

(3)积性函数

定义:若函数 f ( x ) f(x) f(x)满足当 g c d ( x , y ) = 1 gcd(x,y)=1 gcd(x,y)=1时, f ( x y ) = f ( x ) f ( y ) f(xy)=f(x)f(y) f(xy)=f(x)f(y),则称 f ( x ) f(x) f(x)为积性函数

特别地,当函数 f ( x ) f(x) f(x)满足 ∀ x , y ∈ Z \forall x,y\in\Z x,yZ f ( x y ) = f ( x ) f ( y ) f(xy)=f(x)f(y) f(xy)=f(x)f(y),则称 f ( x ) f(x) f(x)为完全积性函数

(4)狄利克雷卷积

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值