1.唯一分解定理:把正整数n写成质数的乘积(即n=p1p2p3...pk,其中pi为质数且单调不减),这样的表示是唯一的。
•例题:[CF 776B]Sherlock and his girlfriend
•n个点,标号2..n+1,
•给这些点染色,要求若a是b的质因子,则a和b的颜色不同。
•求一种颜色数最少的方案
解:我们只需要2种颜色即可,质数一种颜色,合数一种颜色就可以了。
2.整除
设a,b是两个正整数,且b!=0,则存在唯一的整数q和r,使 a=qb+r,这个式子叫做带余除法
性质:
•1整除任何数,任何数都整除0
•若a|b,a|c,则a|b+c, a|b-c
•若a|b,则对任意整数c,a|bc
•传递性:若a|b,b|c,则a|c
3.约数
对于一个大于1正整数n可以分解质因数:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
则由约数个数定理可知n的正约数有(a₁+1)(a₂+1)(a₃+1)…(ak+1)个,
那么n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)个正约数的和为
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)
看计算约数模板之前还有学会素数筛,筛法有很多,二重暴力O(n^2),埃氏筛法,O(nloglogn),欧拉筛O(n).显然欧拉筛是时间复杂度最低的。
欧拉筛模板:
1 for (int i=2;i<=n;i++) 2 { 3 if (!pri[i])ans[++tot]=i; 4 for (int j=1;(j<=tot)&&(i*ans[j]<=n);j++) 5 { 6 pri[i*ans[j]]=1; 7 if (i%ans[j]==0)break; 8 } 9 }
我觉得这个博客讲的比较好:https://blog.csdn.net/qq_39763472/article/details/82428602
很难懂的一个点:
if (i%ans[j]==0)break;
其实打个表出来看看会发现其实意思就是一个非素数只能用它的最小质因数筛掉,避免重复筛,以达到O(n)的复杂度。