(一)定理和性质
一、裴蜀定理
如果
a,b∈N
a
,
b
∈
N
,
(a,b)=d
(
a
,
b
)
=
d
那么一定存在
x,y
x
,
y
使得
d|(a∗x+b∗y)
d
|
(
a
∗
x
+
b
∗
y
)
证明:非常简单,鉴于可能有数论刚入门的OIer所以这里简单证明一下:
因为
(a,b)=d
(
a
,
b
)
=
d
所以我们就可以假设
a=p∗d
a
=
p
∗
d
,
b=q∗d
b
=
q
∗
d
那么
a∗x+b∗y=p∗d∗x+q∗d∗y=d∗(p∗x+q∗y)
a
∗
x
+
b
∗
y
=
p
∗
d
∗
x
+
q
∗
d
∗
y
=
d
∗
(
p
∗
x
+
q
∗
y
)
得证
二、整除的性质
正确性显然
三、同余
第二个式子证明:
(a−b)=x∗m=y∗n=k∗[m,n]
(
a
−
b
)
=
x
∗
m
=
y
∗
n
=
k
∗
[
m
,
n
]
第三个式子证明:
k=q∗d,m=p∗d
k
=
q
∗
d
,
m
=
p
∗
d
k∗a−k∗a′=c∗m
k
∗
a
−
k
∗
a
′
=
c
∗
m
a−a′=c∗mk=c∗mq∗d=cq∗md
a
−
a
′
=
c
∗
m
k
=
c
∗
m
q
∗
d
=
c
q
∗
m
d
四、逆元
如果
(b,m)=1
(
b
,
m
)
=
1
,那么存在
b−1
b
−
1
使得
b∗b−1≡1(mod m)
b
∗
b
−
1
≡
1
(
m
o
d
m
)
P.S:这个-1次方只是表示逆元一个符号 并不是真的-1次方 但是可以把它当成-1次方在同余中进行运算
五、剩余系
任何m个分别属于m个剩余类的数组组成剩余系
六、φ
所有的n满足
0<n≤m
0
<
n
≤
m
,
(n,m)=1
(
n
,
m
)
=
1
构成了一个模m的简化剩余系,简称缩系
记录这样的n的个数为
φ(m)
φ
(
m
)
七、关于缩系的一个定理
如果
(m,m′)=1
(
m
,
m
′
)
=
1
,a取遍模m的缩系,a’取遍模m’的缩系,那么
a∗m′+a′∗m
a
∗
m
′
+
a
′
∗
m
取遍模
m∗m′
m
∗
m
′
的缩系
证明自己yy一下好啦
八、欧拉定理
如果
(a,m)=1
(
a
,
m
)
=
1
,那么
aφ(m)≡1(mod m)
a
φ
(
m
)
≡
1
(
m
o
d
m
)
证明:
当x取遍模m的缩系时,ax也取遍模m的缩系(这个自己yy一下,具体证明不太会说qwq)
所以我们可以得出
∏x≡∏a∗x(mod m)
∏
x
≡
∏
a
∗
x
(
m
o
d
m
)
∏a∗x≡aφ(m)∏x
∏
a
∗
x
≡
a
φ
(
m
)
∏
x
用处:如果
(a,m)=1
(
a
,
m
)
=
1
,
abmod m
a
b
m
o
d
m
可以转化成
ab mod φ(m)mod m
a
b
m
o
d
φ
(
m
)
m
o
d
m
如果
(a,m)≠1
(
a
,
m
)
≠
1
,
ab≡amin(b mod φ(m)+φ(m),b) mod m
a
b
≡
a
m
i
n
(
b
m
o
d
φ
(
m
)
+
φ
(
m
)
,
b
)
m
o
d
m
九、拉格朗日定理
对于一个次数为n的多项式F(x), F(x)≡0(mod p) F ( x ) ≡ 0 ( m o d p ) 至多 min(n,p) m i n ( n , p ) 个解。
十、二次剩余
对于一个奇素数p,如果存在x使得
x2≡a(mod p)
x
2
≡
a
(
m
o
d
p
)
,那么称a为p的二次剩余。
如果
ap−12≡1(mod p)
a
p
−
1
2
≡
1
(
m
o
d
p
)
,那么a为p的二次剩余。
如果
ap−12≡−1(mod p)
a
p
−
1
2
≡
−
1
(
m
o
d
p
)
,那么a为p的二次非剩余。
十一、威尔逊定理
(p−1)!≡−1(mod p)
(
p
−
1
)
!
≡
−
1
(
m
o
d
p
)
证明:2到p-2这些数都存在逆元,可以两两匹配
十二、阶
如果
(a,m)=1
(
a
,
m
)
=
1
那么记x为最小的正整数使得
ax≡1(mod m)
a
x
≡
1
(
m
o
d
m
)
结论:
x|φ(m)
x
|
φ
(
m
)
证明:反证法,设有一个最小的x ,
φ(m)=q∗x+r
φ
(
m
)
=
q
∗
x
+
r
,
则
aq∗x+r≡1(mod m)
a
q
∗
x
+
r
≡
1
(
m
o
d
m
)
ax≡1(mod m)
a
x
≡
1
(
m
o
d
m
)
推出
ar≡1(mod m)
a
r
≡
1
(
m
o
d
m
)
因为x是最小的满足条件的正整数 ,
r<x
r
<
x
,所以
r=0
r
=
0
十三、原根
如果
g(mod m)
g
(
m
o
d
m
)
的阶为
φ(m)
φ
(
m
)
那么g为m的原根
g0,g1,…,gφ(m)−1
g
0
,
g
1
,
…
,
g
φ
(
m
)
−
1
构成了模m的缩系。
只有
1,2,4,pa,2pa
1
,
2
,
4
,
p
a
,
2
p
a
存在原根。
十四、其他
φ(p∗e)=(p−1)∗p∗e−1
φ
(
p
∗
e
)
=
(
p
−
1
)
∗
p
∗
e
−
1
φ(m)=m∗∏p|m(1−1/p)
φ
(
m
)
=
m
∗
∏
p
|
m
(
1
−
1
/
p
)
(容斥原理求φ)
(二)算法
一、辗转相除法
直接贴代码吧,证明网上有详解,这里不再赘述
int gcd(int a,int b)
{
if (b==0) return a;
else return gcd(b,a%b);
}
二、扩展欧几里得算法
用处:求解形如
a∗x+b∗y=gcd(a,b)
a
∗
x
+
b
∗
y
=
g
c
d
(
a
,
b
)
的二元方程和线性同余方程
(
a∗x≡b(mod m)
a
∗
x
≡
b
(
m
o
d
m
)
等价于
a∗x+m∗y=b
a
∗
x
+
m
∗
y
=
b
)
推导:假设解出一组解
(p,q)
(
p
,
q
)
p∗a+q∗b=gcd(a,b)
p
∗
a
+
q
∗
b
=
g
c
d
(
a
,
b
)
=
gcd(b,a mod b)=p∗b+q∗(a mod b)=p∗b+q∗(a−(ab)∗b)
g
c
d
(
b
,
a
m
o
d
b
)
=
p
∗
b
+
q
∗
(
a
m
o
d
b
)
=
p
∗
b
+
q
∗
(
a
−
(
a
b
)
∗
b
)
=
p∗b+q∗a−q∗(ab)∗b=(p−q∗(ab))∗b+q∗a
p
∗
b
+
q
∗
a
−
q
∗
(
a
b
)
∗
b
=
(
p
−
q
∗
(
a
b
)
)
∗
b
+
q
∗
a
代码
int extended_gcd(int a,int b,int &x,int &y)
{
int ret,tmp;
if (!b)
{
x=1;y=0;return a;
}
ret=extended_gcd(b,a%b,x,y);
tmp=x;
x=y;
y=tmp-a/b*y;
return ret;
}
一个神奇的小结论:
对方程
a∗x+b∗y=c
a
∗
x
+
b
∗
y
=
c
,一组整数解为
(x0,y0)
(
x
0
,
y
0
)
,
则它的任意整数解可以写成
(x0+k∗b′,y0−k∗a′)
(
x
0
+
k
∗
b
′
,
y
0
−
k
∗
a
′
)
,其中
a′=agcd(a,b)
a
′
=
a
g
c
d
(
a
,
b
)
,
b′=bgcd(a,b)
b
′
=
b
g
c
d
(
a
,
b
)
证明:
如果我们现在有解
(x1,y1)
(
x
1
,
y
1
)
,任取另外一组解
(x2,y2)
(
x
2
,
y
2
)
,则
a∗x1+b∗y1=a∗x2+b∗y2=gcd(a,b)
a
∗
x
1
+
b
∗
y
1
=
a
∗
x
2
+
b
∗
y
2
=
g
c
d
(
a
,
b
)
变形可以得到
a∗(x1–x2)=b∗(y2–y1)
a
∗
(
x
1
–
x
2
)
=
b
∗
(
y
2
–
y
1
)
两边同时除以
gcd(a,b)
g
c
d
(
a
,
b
)
得到
a′∗(x1–x2)=b′∗(y2–y1)
a
′
∗
(
x
1
–
x
2
)
=
b
′
∗
(
y
2
–
y
1
)
因为
(a′,b′)=1
(
a
′
,
b
′
)
=
1
,所以
(x1−x2)
(
x
1
−
x
2
)
一定是b’的倍数
取
x1−x2=k∗b′
x
1
−
x
2
=
k
∗
b
′
,得
y2−y1=k∗a′
y
2
−
y
1
=
k
∗
a
′
三、求逆元
由于
aφ(m)≡1(mod m)
a
φ
(
m
)
≡
1
(
m
o
d
m
)
那么
a−1≡aφ(m)−1(mod m)
a
−
1
≡
a
φ
(
m
)
−
1
(
m
o
d
m
)
如果m为素数,那么答案为
am−2
a
m
−
2
否则解线性同余方程
四、线性求1到n的逆元
设
f(i)=i! mod p,g(i)=i!−1 mod p
f
(
i
)
=
i
!
m
o
d
p
,
g
(
i
)
=
i
!
−
1
m
o
d
p
g(i)=g(i+1)∗(i+1)
g
(
i
)
=
g
(
i
+
1
)
∗
(
i
+
1
)
i−1=f(i−1)∗g(i)
i
−
1
=
f
(
i
−
1
)
∗
g
(
i
)
算出
fn
f
n
然后求出
fn
f
n
的逆元
gn
g
n
,递推即可。
五、线性同余方程组(CRT)
形如
x≡ai(modmi)
x
≡
a
i
(
m
o
d
m
i
)
解法:增量法
假设一开始的方程
x≡a1(mod p1),x≡a2(mod p2)
x
≡
a
1
(
m
o
d
p
1
)
,
x
≡
a
2
(
m
o
d
p
2
)
那么有
p1t+a1≡a2(mod p2)
p
1
t
+
a
1
≡
a
2
(
m
o
d
p
2
)
p1t≡a2−a1(mod p2)
p
1
t
≡
a
2
−
a
1
(
m
o
d
p
2
)
p1t+p2y=a2−a1
p
1
t
+
p
2
y
=
a
2
−
a
1
可以通过扩欧解出一个解
t0
t
0
t≡t0(mod p2gcd(p2,p1))
t
≡
t
0
(
m
o
d
p
2
g
c
d
(
p
2
,
p
1
)
)
(通过扩欧的小结论得出)
x0=p1t0+a1
x
0
=
p
1
t
0
+
a
1
x≡x0(mod lcm(p1,p2))
x
≡
x
0
(
m
o
d
l
c
m
(
p
1
,
p
2
)
)
满足左边等式的x都是这两个方程符合条件的解
然后加入下一个方程
六、求n!中p的指数
∑i≥1⌊npi⌋
∑
i
≥
1
⌊
n
p
i
⌋
还有一个O(1)求的公式(可以用于一些奇怪的数位dp)
n−f(n)p−1
n
−
f
(
n
)
p
−
1
f(n) 表示 n在p进制下的数位和
然而公式怎么推的并不会。。。
七、组合数
n,m较小的话
C(n,m)=C(n−1,m)+C(n−1,m−1)
C
(
n
,
m
)
=
C
(
n
−
1
,
m
)
+
C
(
n
−
1
,
m
−
1
)
递推即可(NOIP2017提高组DAY2T1!!!当时就因为不知道递推式吃了亏)
n,m较大的话暴力用
f(n)∗g(m)∗g(n−m)
f
(
n
)
∗
g
(
m
)
∗
g
(
n
−
m
)
求就可以(f,g定义参考线性求1到n逆元里的定义)
还有一种更快的方式求组合数 想学习一下的人百度Lucas定理
这里给出公式:
C(n,m)%p=C(n%p,m%p)∗C(np,mp)%p
C
(
n
,
m
)
%
p
=
C
(
n
%
p
,
m
%
p
)
∗
C
(
n
p
,
m
p
)
%
p
八、求阶
暴力枚举1到φ(m)判断即可
九、求原根
从小到大枚举g然后暴力判断即可
十、指数方程
①
ax≡b(mod m)
a
x
≡
b
(
m
o
d
m
)
如果m为素数:
使用BSGS(baby-step giant-step)解决
令
x=qt−r
x
=
q
t
−
r
( t一般取根号下m上取整)
则
aqt≡b∗ar(mod m)
a
q
t
≡
b
∗
a
r
(
m
o
d
m
)
从0-m 枚举r 算出
b∗ar
b
∗
a
r
的值 填入一个哈希表中
从1-m 枚举q 算出
aqt
a
q
t
的值,在哈希表中检索
如果m不是素数:
提取公因数直到
gcd(a,m)=1
g
c
d
(
a
,
m
)
=
1
可能大家不理解
举个栗子:
假设我们要解一个方程
8x≡16(mod 24)
8
x
≡
16
(
m
o
d
24
)
8和24不互质
所以我们先提取一个8
变成
8∗8x−1≡16(mod 24)
8
∗
8
x
−
1
≡
16
(
m
o
d
24
)
然后约一下变成
8x−1≡2(mod 3)
8
x
−
1
≡
2
(
m
o
d
3
)
最后用BSGS求解得x=2
如果
(a,m)≠(a,m,b)
(
a
,
m
)
≠
(
a
,
m
,
b
)
的话无解
②
xa≡b(mod m)
x
a
≡
b
(
m
o
d
m
)
如果m为素数:
如果
gcd(a,φ(m))=1
g
c
d
(
a
,
φ
(
m
)
)
=
1
,那么求出a模φ(m)的逆元
a−1
a
−
1
xa∗a−1≡x≡ba−1(mod m)
x
a
∗
a
−
1
≡
x
≡
b
a
−
1
(
m
o
d
m
)
直接解x即可
否则:
先求出m的原根g
解出一个s符合
gs≡b(mod m)
g
s
≡
b
(
m
o
d
m
)
假设
x=gt
x
=
g
t
那么
gat≡gs(mod m)
g
a
t
≡
g
s
(
m
o
d
m
)
由原根的性质得到:
at≡s(mod φ(m))
a
t
≡
s
(
m
o
d
φ
(
m
)
)
解出t即可
如果m不为素数:
分解m然后用CRT合并
当出现2^n时,因为它没有原根,所以说枚举答案即可
十一、二次剩余
形如
x2≡b(mod p)
x
2
≡
b
(
m
o
d
p
)
判断一个数是不是另一个数的二次剩余,只需要计算
bp−12%p
b
p
−
1
2
%
p
是否等于1即可
复杂度O(p)
还有一种O(log n)的算法叫做cipolla’s algorithm,然而我并不会这种算法,而且这种算法貌似非常冷门,只有维基百科上才能查到…
至于二次剩余的用处嘛…据说可以用来卡常数
十二、Miller-rabin
一个判断一个数是不是素数的算法
并不会写…直接背代码就好2333
十三、Pollard-rho
分解质因数
也不会写…也可以直接背代码QwQ
(三)数论函数
一、积性函数
对于
gcd(a,b)=1
g
c
d
(
a
,
b
)
=
1
,如果
f(a∗b)=f(a)∗f(b)
f
(
a
∗
b
)
=
f
(
a
)
∗
f
(
b
)
那么f(x) 为积性函数
常见的积性函数
d(x),σ(x),id(x),e(x),l(x),μ(x)
d
(
x
)
,
σ
(
x
)
,
i
d
(
x
)
,
e
(
x
)
,
l
(
x
)
,
μ
(
x
)
d(x)=∑a|x1
d
(
x
)
=
∑
a
|
x
1
σ(x)=∑a|xa
σ
(
x
)
=
∑
a
|
x
a
id(x)=x
i
d
(
x
)
=
x
l(x)=1
l
(
x
)
=
1
e(x)=1(x=1)
e
(
x
)
=
1
(
x
=
1
)
e(x)=0(x≠1)
e
(
x
)
=
0
(
x
≠
1
)
二、狄利克雷卷积
两个数论函数
f(x),g(x)
f
(
x
)
,
g
(
x
)
,令
h=f∗g
h
=
f
∗
g
则
h(x)=∑a|xf(a)g(xa)
h
(
x
)
=
∑
a
|
x
f
(
a
)
g
(
x
a
)
几条性质:
①卷积满足交换律,结合律。
②两个积性函数的卷积还是积性函数
③
f∗e=f
f
∗
e
=
f
三、莫比乌斯函数
μ(n)=−1k
μ
(
n
)
=
−
1
k
(k为n分解质因数后不同质因数的个数)
如果n有平方因子那么
μ(n)=0
μ
(
n
)
=
0
如何
n=1
n
=
1
那么
μ(n)=1
μ
(
n
)
=
1
μ∗l=e
μ
∗
l
=
e
即
∑d|nμ(d)=e(n)
∑
d
|
n
μ
(
d
)
=
e
(
n
)
(这个结论大家自己想一下,可以借助杨辉三角辅助理解)
四、莫比乌斯反演
1.如果
F(n)=∑d|nf(d)
F
(
n
)
=
∑
d
|
n
f
(
d
)
那么
f(n)=∑d|nμ(d)∗F(nd)
f
(
n
)
=
∑
d
|
n
μ
(
d
)
∗
F
(
n
d
)
推导:
F=f∗l
F
=
f
∗
l
F∗μ=f∗l∗μ=f∗e=f
F
∗
μ
=
f
∗
l
∗
μ
=
f
∗
e
=
f
2.如果
F(n)=∑n|df(d)
F
(
n
)
=
∑
n
|
d
f
(
d
)
那么
f(n)=∑n|dμ(dn)∗F(d)
f
(
n
)
=
∑
n
|
d
μ
(
d
n
)
∗
F
(
d
)
五、线性筛素数
思想:每个合数只被它最小的素因子访问到
代码:
void get_prim(int n)
{
vis[1]=1;
for (int i=2;i<=n;i++)
{
if (!vis[i])
{
cnt++;prim[cnt]=i;
}
for (int j=1;j<=cnt&&i*prim[j]<=n;j++)
{
vis[i*prim[j]]=1;
if (i%prim[j]==0) break; //看不懂这一步的去重新理解思想
}
}
}
扩展:通过线性筛可以线性求出一个积性函数的值。
欢迎各位神犇前来交流qwq