约数定义:约数,又称因数。整数a除以整数b(b≠0)除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数,记作b a。(其实中间的整除符号应该是|,但是由于这个竖线在数学其他领域用得太多,容易混淆,学学高德纳的做法,把作为整除符号。而且反斜杠让有一种右边除左边的感觉,更容易把整除式理解正确,不然这个概念感觉挺绕的。)
整除的性质
1.若a,bc,则ac。(传递性?)
2.若a,ac 等价于 对于任意整数x,y,都有 a(bx+cy)
3.设m (
eq) 0,那么a,等价于 (m * a) (m * b) (同乘性?)
4.设整数x,y满足ax+by=1,且a
,b
,那么有(a*b)
证明:
因为a n,b n
所以 (a * b) (b * n) ,(a * b) (a * n)
所以 (a * b) ( y * b * n+ x * a * n )
所以(a * b) n * (y * b +x * a)
所以 ( a * b)
证毕
5.若b =q*d+r,则 d|b的充要条件是 d|r
6.设整数x的个位数为a,判断其是否能被n整除:
令 (frac{x-a}{10} - m*a=n*k(k in N) \
则x=n[10k+ frac{(10m+1)a}{n} ],)
要使x能被n整除,只要 $ frac{10m+1}{n} $为自然数。
~~源于百度百科,不会证明
算术基本定理推论:1.N的正约数集合可以写作{ $ p^{b_1}_1 p^{b_2}_2 cdots p^{b_m}_m $ } $ ,0 le b_i le c_i$
$qquad qquad qquad $ 2. N的正约数个数为 $ (c_1+1)* (c_2+1)* cdots * (c_m+1) = prod _{i=1}^{m} (c_i+1) $
$qquad qquad qquad $ 3. N的所有正约数的和为 $$ (1+p_1+p^2_1 + cdots + p^{c_1}_1 )* cdots *(1+p_m+ p^2_m + cdots + p^{c_m}_m ) = prod _{i=1}^{m} sum _{j=0}^{c_i} (p_i)^j $$
求N的正约数集合(试除法)
对于一个非完全平方数,它的约数总是两两出出现的。若(d ge sqrt N) 是N的约数,则$ N/d le sqrt{N}$ 也会是N的约数,所以我们只要扫描 1~ $ sqrt N$的数d,尝试d能否整除N,如果可以,那么d和N/d都是N的约数。时间复杂度 $ O sqrt N) $。
int factor[1000], m = 0;
int t = sqrt(n);
rep(i, 1, t) {
if(n % i == 0) {
factor[++m]=i;
if(i!=n/i) factor[++m]=n/i;
}
}
试除法的推论: 一个整数的约数个数上界为(2sqrt N)
求1~N每个数的正约数集合(倍数法)
对于每个数d,1~N中以d为约数的数就是d的倍数d,2d,3d,···(lfloor N/d
floor *d)。时间复杂度为(O(N+N/2+N/3+cdots+N/N)=O(Nl og N))
vector<int>factor[1000];
rep(i,1,n){
int t=n/i;
rep(j,1,t)
factor[i*j].push_back(i);
}
倍数法的推论:1~N每个数约数总和约为N log N。