学习笔记10-18
\(\Huge\color{Red}{10.18}\) \(\Large{\color{Blake}{主题:约数}}\)
主要内容:
.整除
-
\(a=b \times c\),则称\(a\)被\(b\)整除,或\(b\)整除\(a\),记作\(a\mid b\)。
-
\(a=qb+r,(0\le r< \left| b \right|)\),记\(r=a\bmod b\)。
-
整除的性质:
- 若\(a|b\)且\(a|c\),则\(\forall x,y\),有\(a|xb+yc\)。
- 若\(a|b\)且\(b|c\),则\(a|c\)。
- 设\(m\ne0\),则\(a|b\),当且仅当\(ma|mb\)。
- 若\(a|b\)且\(b|a\),则\(a=\pm b\)。
.约数
- 算数基本定理的推论
对于正整数N......
- N的正约数集合:
\[{\{p_1^{b_1}p_2^{b_1}...p_m^{b_m}}\}
\]
- N的正约数个数:
\[\prod\limits_{i=1}^m(c_i+1)
\]
- N的所有正约数的和:
\[\prod\limits_{i=1}^m\left(\sum\limits_{j=0}^{c_i}(p_i^j)\right)
\]
- 求N的正约数集合——试除法:
- 扫描\(d=1\sim\sqrt{N}\)尝试是否\(d|N\),若能,则\(d\)与\(N/d\)都是N的约数。复杂度:\(O(\sqrt{N})\)。
- 试除法的推论
- 一个整数N的约数上限个数为\(2 \sqrt{N}\)。
- 求\(1\sim{N}\)每个数的正约数集合——倍数法
- \(\forall d,1 \sim N\)中以\(d\)为约数的数就是\(d,2d,3d,...,\left\lfloor{N/d}\times d\right\rfloor\)。
- 时间复杂度:\(O(NlogN)\)。
Code:
vector<int>factor[500010]
for(int i=1;i<=n;i++)
for(inr j=1;i*j<=n;j++)
factor[i*j].push_back(i);
for(int i=1;i<=n;i++)
{
for(int j=0;j<factor[i].size;k++)
printf("%d",factor[i][j]);
puts(" ");
}
- 倍数法的推论:
- \(1\sim N\)每个数的约数个数的总和大约为\(NlogN\)。
例题:P1463 [POI2002][HAOI2007]反素数
.最大公约数与最小公倍数
性质:
- 若\(a|m\),\(b|m\),则\(\operatorname{lcm}(a,b)|m\)。
- 若\(d|a\),\(b|m\),则\(d|\gcd(a,b)\)。
- \(\operatorname{lcm}(ma,mb)=m \times\operatorname{lcm}(a,b)\).
- \(\mathcal{\color{Red}{important}}\)
\[a\times b=\gcd(a,b)\times \operatorname{lcm}(a,b)
\]
可用此条性质求出\(\gcd(a,b)\)后用\(a\times b/\gcd(a,b)\)求\(\operatorname{lcm}(a,b)\)。
.最大公约数的求法
方法一:用唯一分解定理
先分解质因数,然后求最大公约数。
令:
\[a=p_1^a1\times p_2^a2\times...\times p_m^am
\]
\[b=p_1^b1\times p_2^b2\times...\times p_m^bm
\]
则
\[\gcd(a,b)=p_1^{\min(a1,b1)}\times p_2^{\min(a2,b2)}\times...\times p_m^{\min(am,bm)}
\]
方法二:九章算术·更相减损术
\(\forall a,b\in N,a\ge b,\)有\(\gcd(a,b)=\gcd(b,a-b)=\gcd(a,a-b)\)
\(\forall a,b\in N,\)有\(\gcd(2a,2b)=2 \times \gcd(a,b)\)
方法三:欧几里得算法
\(\mathcal{\color{Red}{important}}\)
\[\forall a,b\in N,b\ne 0,\gcd(a,b)=\gcd(b,a\bmod b)
\]
Code:
int gcd(int a,int b)
{
return (b==0)?a:gcd(b,a%b);
}
方法四:二进制算法
若\(a=b,\gcd(a,b)=a;\)否则,分情况讨论
- \(a\)和\(b\)均为偶数,\(\gcd(a,b)=2 \times \gcd(a/2,b/2);\)
- \(a\)为偶数,\(b\)为奇数\(\gcd(a,b)=\gcd(a/2,b);\)
- \(b\)为偶数,\(a\)为奇数\(\gcd(a,b)=\gcd(a,b/2);\)
内心戏:
没啥捷径。记好结论多推推公式才有正解。
高精冲冲冲!
这玩意儿太难写了。一百多行。以后再也不写了