数论与组合数学基础
数论基础
整除: a整除b 记做a|b
因数与倍数: a|b即a是b的因数,b是a的倍数
带余除法: 对于整数a,b(b!=0),设a除以b的商为q,余数为r,则a=bq+r,q,r为整数且0≤r≤|b|
模: a除以b余数为r,记为a modb = r
同余: a,b模p同余即a,b除以p的余数相同,记做a≡b(mod p)
类比十进制运算个位数的规律,不难发现:
(amodp±bmodp)modp=(a±b)modp
(
a
m
o
d
p
±
b
m
o
d
p
)
m
o
d
p
=
(
a
±
b
)
m
o
d
p
(amodp)(bmodp)modp=abmodp
(
a
m
o
d
p
)
(
b
m
o
d
p
)
m
o
d
p
=
a
b
m
o
d
p
注意C++的取模和取余是不一样的,C++的取模是保留符号
的,如(−4) mod 3 = 2,但C++中(-4)%3=-1
质数:正因数只包含1和它本身的正整数(2,3,5,7···)
合数:正因数包含除1和它本身外的数的正整数
(4,6,8,9···)
筛质数
1.暴力枚举
枚举i=1,2,……,n 判断i是否包含【2,√i】内的因数(因数集合具有对称性) 效率太低,考虑改进!!!!
2.一种筛(不知道叫啥)
枚举正整数a,b ≥ 2且ab ≤ n,将ab标记为合数
3.埃拉托斯特尼筛法(埃氏筛法):
优化:只要枚举a为质数的ab
4.线性筛:
性筛法基本思想:每个数只被最小的质因子筛一次,即对
于a是质数,b的最小质因子不小于a的整数对a,b,标记ab为合数
实现:先枚举b,再枚举a,枚举到a|b时结束
质数分布定理:π(n) ∼n/lnn ,π(n)为n以内质数个数
所以存放质数的数组可以开小一些
给定正整数n ≤ 10 7 ,求n的质因数分解式
O(n)预处理n以内质数,同时预处理每个合数x的最小质因
子p x
每次分解不断将n提取一个p x
由于每提取一个质因子n就会减半,单次分解复杂
度O(logn)
最小公倍数与最大公约数
a,b的最大公因数为最大的正整数c,c|a且c|b,记
作c = gcd(a,b)或c = (a,b),特别地(a,0) = (0,a) = 0
a,b的最小公倍数为最小的正整数c,a|c且b|c,记
作c = lcm(a,b)或c = [a,b]
性质:
(a,b) = (a,b ± a)
(a,b) · [a,b] = ab
给定正整数a 0 ,a 1 ,b 0 ,b 1 ,求有多少个正整数x满足:
1. x和a 0 的最大公约数是a 1
2.x和b 0 的最小公倍数是b 1
不超过2000组数据,a 0 ,a 1 ,b 0 ,b 1 ≤ 2 × 10 9
原根
常用的数论函数
注意!!!