数论在ACM中的应用
转自:http://blog.csdn.net/danliwoo/article/details/48827813#t22
整除与剩余
整除在自然数范围内的引入是十分自然的,即要把一个整体平均分为若干份。若要求分得的结果必须是整数,则可能存在多余的情况,即余数。
若a能整除b,可记作:a∣b,否则a∤b
整数是对自然数的扩充,引入了负数的概念。负的余数是一个数学概念,在实际情形中说剩余的东西是负数,往往是可笑的。因为那意味着并没有剩余。利用同余,可以给出这类情况的意义。
整除判断多利用代数恒等变形,可尝试证明如下两题:
1. 设
2. 设
同余,即除同一个数得到相同的余数。例如
若a和b模d同余,则下列命题等价:
a和b模d同余⇔存在整数n,使得a=b+nd⇔d∣(a−b)
当a是一个负数时,则将n置为负数。
几个看两眼的定理:
- 若
a≡b(modm)且d∣m,则a≡b(modd) ;- 若
a≡b(modm),则(a,m)=(b,m) (辗转相除法);∀1≤i≤n,a≡b(modmi)⇔a≡b(mod[m1,m2,...,mn]) - 若
ac≡bc(modm),且(c,m)=d,则a≡b(modmd)
对于相同的模,同余式可以加、减、乘,可以通过上述等价的命题快速证明。在计算整数幂的同余式时可以根据乘法性质对小指数的先进行模运算,再代回原式,可以减小一定的计算量。例如计算
有些题目答案过大时,往往要求输出mod一个大数N的答案。可以在中间过程中先mod N,避免超int。
某些数被模除时具有特别的性质,下面看一道自己出的题:
题目大意:从
由于数据范围不大,可以暴力试试看。机智的会用数位DP。而出题人其实是从数论的角度出发的。已知:
对于任意的正整数
素数问题
基本描述
素数仅能被1和自身整除(除1外),可以看作是组成整数的基本单位。
要知道一个整数的阶乘能被素数p整除多少次,即p的幂为多少次,可利用:
其中
素数定理:定义
π(x) 为1~x内素数的个数(即欧拉函数),则:limx→∞π(x)xln(x)=1⇔x→∞时,π(x)∼xln(x)
由此可以估算出在1~x范围内素数的个数。
素数的形成没有成型的规律,但有许多相关的猜想。
- 伯特兰猜想:
∀n>1,∃素数p,s.t.n<p<2n - 孪生素数:存在无穷多素数对p,p+2.
- 哥德巴赫猜想:任何偶数都可以拆分成两个素数的和。
- 构造猜想:存在无穷多个素数满足
p=n2+1
素数筛法
- 埃拉托斯尼斯筛法
先将2~N内所有的数标记为素数,从最小的素数开始筛去其倍数,再找到下一个素数,依次筛去非素数的数,剩余的即为素数。
需要筛的素数范围只需在2~N−−√ .
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
在POJ 2689,可以节省空间大小。
- 6N
± 1筛法
由于6N,6N+2,6N+3,6N+4(N>0)均不是素数,故在筛素数时可以直接从6N± 1中判断和筛选素数。
素数判定
- 朴素的暴力判断算法
O(n−−√)
从0~n−−√ 依次尝试能否整除 - 素数筛法后直接判定
O(1) - Lucas-Lehmer判定法(只对梅森数1作用)
设p是素数,第p个梅森数为Mp=2p−1,r1=4. 对于k≥2,rk≡rk−12−2(modMp),(0≤rk<Mp) ,得到序列{rk }
Mp是素数 ⇔ rp−1≡0(modMp) - Miller-Robin测试
判断n是否为素数
- 二次探测
对卡麦尔数(伪素数)进行测试
二次探测定理:对素数
p,满足x2≡1(modp) 的小于p的正整数解x只有1或p−1 .
对n-1除2,检验
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
剩余系配对
素数p的完全剩余系为0~p-1,其中
整数分解
将整数化为质因子的幂的乘积的唯一形式。常用试除法、筛选法,比较简单不举例了。对于非常大的数而言,两者用处不大。
Pollard ρ 整数分解法
原理还不太懂:
1. 生成两个整数a、b,计算p=(a-b,n),直到p不为1或a,b出现循环为止。
2. 若p=n,则n为质数;否则为n的一个约数。
分解n的具体步骤如下:
1. 选取一个小的随机数
2. 计算
3. 若p=n,则n为素数。否则p为n的约数,继续分解p和n/p
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
扩展欧几里得
辗转相除法可以来求a,b两个数的最大公约数。而辗转相除的过程中,附带也可以得到满足
先来解决
- 最简情况:
b=0 时,gcd(a,b)=a ,方程化为ax=a ,则一组特殊解为(1,0) - 当
b≠0 时,由辗转相除法gcd(a,b)=gcd(b,a%b)
bx′+(a%b)y′=gcd(b,a%b) a%b=a−⌊ab⌋×b ,代入前一方程,得到
ay′+b(x′−⌊ab⌋y′)=gcd(a,b) ax+by=gcd(a,b) ,可知:x=y′,y=(x′−⌊ab⌋y′) 得到一组递推关系。 - 方程依次向下递归可以得到最简情况,得到解(1,0),再由递推关系回代到上一组解,最终可以得到方程(*)的解。 注意到,这是一组特解,并不唯一。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-
回到方程
(△) 首先,判断gcd(a,b) 是否是c的约数。若非,则方程无解。 -
下面考虑
gcd(a,b)∣c ,则方程有解。
由扩展欧几里得算法算出方程ax+by=gcd(a,b) 的特解(x0,y0)
原方程(△) 的特解(X0,Y0)=(x0,y0)⋅cgcd(a,b)
为保证整数解则ΔY=aΔXb∈Z,则ΔX=bgcd(a,b)
原方程(△) 的解系为{X=X0+bgcd(a,b)⋅K\[2ex]Y=Y0−agcd(a,b)⋅KK为任意整数 。 -
令
K从0取到[gcd(a,b)−1] ,求出方程所有解中的代表元素共有gcd(a,b) 个。是X模b意义下的所有解。其中最小非负整数解x1=(x0⋅cgcd(a,b)%ran+ran)%ran,其中ran=bgcd(a,b) (在模ran范围内有唯一的解)x1 是模ran范围内最小的正整数解,又ran∣b则必是模b 范围内最小的正整数解。 -
注意:解系中解的间隔与c无关。也可以从坐标系上的直线看出来。直线与网格的交点为一组整数解,c只决定了直线的平移位置,a,b决定了斜率。
拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过两个整数中较小的那个十进制数的位数的5倍。
推论:求两个正整数
扩展欧几里得的应用
主要有:求解不定方程、模的逆元、同余方程。如POJ 1061,只要化为
解二元一次线性方程
注意:为保证gcd(a,b)为正,要让a,b均为正,避免错误,此时解应该反号。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
解一元线性同余方程
Thm 对于方程ax≡b(modm) ,其中a,b,m∈Z and m>0,(a,m)=d.如果d∣b, 则方程恰有d个模m不同余的解。否则方程无解。
容易发现,方程
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
求逆元
特别地,当有
解一元线性同余方程组
当有方程组
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
如POJ 1006,由题意可列出满足的方程组,再求出相应的答案。当结果为非正数时利用同余性质化为正数。
中国剩余定理
Thm 若m1,m2,...,mr 是两两互素的正整数,则同余方程组(同上面的解一元线性同余方程组),x≡ai(modmi) 有模M=m1m2...mn 的唯一解。
令
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
解多元线性同余方程
Thm 多元线性同余方程a1x1+a2x2+...+anxn+b≡0(modm) 有解⇔(a1,a2,...,an,m)∣b
若有解,则解(模m的剩余类)的个数为mn−1(a1,a2,...,an,m)
令
解高次同余方程
仅讨论
当A与C互质时,由费马小定理,
-
BSGS(Baby Step Giant Step)算法
- 先把
x=i×m+j,其中m=ceil(C−−√) 这样原式就变为Aim+j≡B(modC) 再变为Aj≡B⋅A−mi(modC) - 先循环
j=0→(m−1) ,把(Aj%C,j) 加入hash表中,这个就是Baby Steps - 然后我们再枚举等号右边
B⋅A−mi(modC) ,(这就是Giant Step),从hash表中找看看有没有,有的话就得到了一组(i,j) ,x=i*m+j
,得到的这个就是正确解
- 先把
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
当A与C不互质时,先进行消因子处理再进行BSGS算法求解。
-
扩展BSGS算法
-
原式等价为
Ax+Cy=B ,消因子处理,使得方程化为aAz+C′y=B′ 满足C′与A 不再有可以约的因子,cnt=x−z 。每次消因子过程中,方程右边也同时消去一样的因子。若不能,则说明方程不可解。将Az 作为一个整体,利用扩展欧几里得算法得到其解系。假设出来的一组原始特解为x0 ,则Az=x0B′+KC′,K 为任意整数。 -
化为高次同余方程
Az≡x0B′(modC′) 利用BSGS求解得到z0,加回cnt 即为原方程的解。 -
注意:这样得到的只有不大于cnt的解。可能会漏掉小于cnt的解。因此先从1~log(MaxN)(一般设定为50即可)暴力查找一遍。
-
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
几类不定方程
毕达哥拉斯三元组
满足方程
Thm x,y,z 构成本原毕达哥拉斯三元组 (y为偶数)⇔∃ 互素的正整数m,n(m>n分别为一奇一偶) 且满足⎧⎩⎨x=m2−n2y=2mnz=m2+n2
很容易证明后者的充分性。在《什么是数学》3书中证明了其必要性。从后者可以看出,本原毕达哥拉斯三元组中的最大数一定是奇数。
特别地,有
如POJ1305
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
佩尔方程
形如整数方程
迭代公式
Thm 设a=x1−y1N−−√,b=x2−y2N−−√ 给出方程x2−Ny2=T 的解,则ab=A−BN−−√ 给出方程x2−Ny2=T2 的解。其中{A=x1x2+Ny1y2B=x1y2+x2y1
取T=1,若最小特解为
求最小特解
- 暴力枚举
- 连分数法(待补坑)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
同余式定理
费马小定理
Thm:若素数p满足p∤a,则ap−1≡1(modp)
利用构造法可以证明定理成立。
比较常用的做法是把除法转换成乘法
可以试试做HDU 4869。相似的还有特别的斐波那契数列 HDU 4549
当斐波那契数列的递推公式由加号改为乘号时,设
威尔逊定理
Thm 若p是素数,则(p−1)!≡−1(modp)
主要是证明在
欧拉定理
Thm 设m是一个正整数,a是一个整数,(a,m)=1, 则aϕ(x)≡1(modm)
特别的
若(a,b)=1,a,b为正整数,则aϕ(b)+bϕ(a)≡1(modab)
欧拉函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22