一、素数
1.素数计数函数
素数计数函数记为 π ( x ) \pi(x) π(x),表示小于等于 x x x的素数的个数,即:
π ( x ) = { n ∣ n ≤ x 且 n 为 素 数 } \pi(x)=\{n|n\leq x且n为素数\} π(x)={n∣n≤x且n为素数}
素数定理:当 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=1∏kaipi
这样的分解称为标准分解式
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
(a−b)%p=(a%p−b%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×b−1 (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+(a−b⌊ba⌋)y2=gcd(b,a−b⌊ba⌋)
成立,根据欧几里得算法,这两个式子右侧是相等的,则有:
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+(a−b⌊ba⌋)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(x1−y2)+b[y1−(x2−⌊ba⌋y2)]=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=(x2−⌊ba⌋y2)
这样,求解 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
2cnt⋅a(
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 a⋅ap−2=1 ( m o d (mod (mod p ) p) p)
逆元即为 a p − 2 a^{p-2} ap−2
法二: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) 1−1=1 (mod p)
其次对于所求的 i − 1 i^{-1} i−1,我们设:
p = k ⋅ i + r ( 1 < r < i < p ) p=k\cdot i+r\space(1<r<i<p) p=k⋅i+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) k⋅i+r=0 (mod p)
两边同时乘 i − 1 ∗ r − 1 i^{-1}*r^{-1} i−1∗r−1可以得到:
k ⋅ r − 1 + i − 1 = 0 ( m o d p ) k\cdot r^{-1}+i^{-1}=0\space(mod\space p) k⋅r−1+i−1=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) i−1=−k⋅r−1=−⌊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)的逆元方法如下:
- 计算 n n n个数 m o d p mod\space p mod p意义下的前缀积,记为 s i s_i si
- 使用扩展欧几里得算法或者快速幂求出 s n s_n sn的逆元,记作 s v n sv_n svn
- 由于 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 n−1个数逆元的前缀积,记为 s v n − 1 sv_{n-1} svn−1
- 同理进行如上 n − 1 n-1 n−1次迭代,就能得到每个数逆元的前缀积,记为 s v i sv_i svi
- 最后每个数的逆元就可以用 s i − 1 ⋅ s v i m o d p s_{i-1}\cdot sv_i\space mod \space p si−1⋅svi 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+k⋅lcm(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=1∑nbi⋅Mi⋅Mi−1
其中, M i = ∏ j ≠ i a j M_i=\prod_{j\neq i} a_j Mi=∏j=iaj, M i − 1 {M_i}^{-1} Mi−1为 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=b1⋅a2a3⋅(a2a3)−1+b2⋅a1a3⋅(a1a3)−1+b3⋅a1a2⋅(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=b1⋅a2a3⋅(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=b2−b1
注意:我们这里将负号给了 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)∣(b2−b1),此时方程的一组解为 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)b2−b1
解出 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 n−1次合并,若出现 g c d ( a 1 , a 2 ) ∤ ( b 2 − b 1 ) gcd(a_1,a_2)\nmid (b_2-b_1) gcd(a1,a2)∤(b2−b1),则证明方程组无解,若没有出现以上情况,则原线性同余方程组的解为最终合并成一个同余方程后的 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={x∣gcd(x,mn)=1}B={(a,b)∣gcd(a,m)=1,gcd(b,n)=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,a2∈A,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)
- ∀ b ∈ B , ∃ a ∈ A , f ( a ) = b \forall b\in B,\exists a\in A,f(a)=b ∀b∈B,∃a∈A,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,x2∈A且满足 ( 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) x≤lcm(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) x≤lcm(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=∑d∣nϕ(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=∑d∣nϕ(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)=pk−pk−1 (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=1∏s(1−pi1)
推导方法:利用容斥原理
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=(n−m)!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!(n−m)!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=0∑n(ni)an−ibi
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 m−1个板放在 n − 1 n-1 n−1个空隙中,结果为 ( n − 1 m − 1 ) \begin{pmatrix}n-1\\m-1\end{pmatrix} (n−1m−1)
拓展:如果可以有空盒子呢?
思路 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+m−1m−1)
例题: 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+k−1k−1)
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(i−1,j)⋅j+S2(i−1,j−1)
通项公式:
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!1⋅k=0∑m(−1)k(mk)(m−k)n
7.贝尔数
第二类斯特林数第二维前缀和,即:
B n = ∑ k = 1 n S 2 ( n , k ) B_n=\sum_{k=1}^nS2(n,k) Bn=k=1∑nS2(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=0∑n(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=(⌊pn⌋⌊pm⌋)(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)Bpk−1⌊pkn⌋Bn 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⌋=⌊c⌊ba⌋⌋
引理2:
对于任意 n , d ∈ Z n,d\in \Z n,d∈Z, ⌊ 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,y∈Z, 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)为完全积性函数