算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如: 6936=23×3×172,1200=24×3×526936=23×3×172,1200=24×3×52。
算术基本定理的内容由两部分构成:
1. 分解的存在性:
2. 分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的。
这里 p1<p2<p3<⋯<pn p1<p2<p3<⋯<pn 且均为质数,其中指数 ai ai 是正整数
定理应用
N的正因数个数
一个大于1的正整数N,如果它的标准分解式为N=pa11pa22pa33⋯pannN=p1a1p2a2p3a3⋯pnan
那么N的正因数个数为
所以N的正因子个数为:所以N的正因子个数为:
N的全体正因数之和为
σ(N)=(1+p1+p21+⋯+pa11)(1+p2+p22+⋯+pa22)⋯(1+pn+p2n+⋯+pann)σ(N)=(1+p1+p12+⋯+p1a1)(1+p2+p22+⋯+p2a2)⋯(1+pn+pn2+⋯+pnan)
σ(N)=(pa1+11−1p1−1)(pa2+12−1p2−1)(pa3+13−1p3−1)⋯(pan+1n−1pn−1)σ(N)=(p1a1+1−1p1−1)(p2a2+1−1p2−1)(p3a3+1−1p3−1)⋯(pnan+1−1pn−1)
σ(N)=∏ni=1pai+1i−1pi−1σ(N)=∏i=1npiai+1−1pi−1
所以N的全体正因子之和为:所以N的全体正因子之和为:
举个例子:
12=22∗31=pa11∗pa22(p1=2a1=2p2=3a2=1)12=22∗31=p1a1∗p2a2(p1=2a1=2p2=3a2=1)
而12的因子有1,2,3,4,6,12而12的因子有1,2,3,4,6,12
1=20∗301=20∗30
2=21∗302=21∗30
3=20∗313=20∗31
4=22∗304=22∗30
6=21∗316=21∗31
12=22∗3112=22∗31
左边加起来=1+2+3+4+6+12=28=(20+21+22)∗(30+31)=右边左边加起来=1+2+3+4+6+12=28=(20+21+22)∗(30+31)=右边
(20+21+22)(20+21+22) 是一个首项为1,公比为2的等比数列
(30+31)(30+31) 是一个首项为1 , 公比为3的等比数列
因为我们对n进行算数分解 所以不可能出现公比为1的情况
根据等比数列求和公式 (1−qn)/(1−q)(1−qn)/(1−q)
分子分母同时乘−1(qn−1)/(q−1)−1(qn−1)/(q−1)
因为第一项是从00开始的 所以 对于 它的前n项和为(pai+1i−1)/(pi−1)(piai+1−1)/(pi−1)
所
σ(N)=∏ni=1pai+1i−1pi−1σ(N)=∏i=1npiai+1−1pi−1
求1到n的因子和的和
公式:
这里以n=12n=12为例:
1:11:1
2:1,22:1,2
3:1,33:1,3
4:1,2,44:1,2,4
5:1,55:1,5
6:1,2,3,66:1,2,3,6
7:1,77:1,7
8:1,2,4,88:1,2,4,8
9:1,3,99:1,3,9
10:1,2,5,1010:1,2,5,10
11:1,1111:1,11
12:1,2,3,4,6,1212:1,2,3,4,6,12
则
ans=σ(1)+σ(2)+σ(3)+⋯+σ(12)ans=σ(1)+σ(2)+σ(3)+⋯+σ(12)
ans=12∗1+6∗2+4∗3+3∗4+2∗5+2∗6+1∗7+1∗8+1∗9+1∗10+1∗11+1∗12ans=12∗1+6∗2+4∗3+3∗4+2∗5+2∗6+1∗7+1∗8+1∗9+1∗10+1∗11+1∗12
ans=∑ni=1n/i∗ians=∑i=1nn/i∗i(这里n/in/i是整除的意思)
然后我们这样看
ans=12∗1+6∗2+4∗3+3∗4+2∗(5+6)+1∗(7+8+9+10+11+12)ans=12∗1+6∗2+4∗3+3∗4+2∗(5+6)+1∗(7+8+9+10+11+12)
则对于每一个 n/in/i 都有一个范围
n/in/i 范围[l,r][l,r]
当前n/in/i 在范围内 对ansans的贡献是
12[1,1]12∗112[1,1]12∗1
6[2,2]6∗26[2,2]6∗2
4[3,3]4∗34[3,3]4∗3
3[4,4]3∗43[4,4]3∗4
2[5,6]2∗(5+6)2[5,6]2∗(5+6)
1[7,12]1∗(7+8+−−−+12)1[7,12]1∗(7+8+−−−+12) 然后这里可以等差数列求和
可以发现 每一个ll等于上一个r+1r+1 而r=n/(n/l)r=n/(n/l)这里是整除
/*
* 求1到n的因子和的和
*
*
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Sigma(ll n)
{
ll ans=0;
ll r;
for(ll l=1;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(l+r)*(r-l+1)/2*(n/l);
//(l+r) 首项+尾项
//(r-l+1) 项数
//(l+r)*(r-l+1)/2 区间和
//(n/l) 是拥有这样因子的区间个数
// printf("l:%2lld r:%2lld l+r:%2lld r-l+1:%lld n/l:%2lld ans:%3lld\n",l,r,l+r,r-l+1,n/l,ans);
}
return ans;
}
int main()
{
ll n;
while(~scanf("%lld",&n))
printf("%lld\n",Sigma(n));
return 0;
}
求1到n的因子个数的和
还是以n=12n=12为例
i: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
因子个数 | 1 | 2 | 2 | 3 | 2 | 4 | 2 | 4 | 3 | 4 | 2 | 6 |
ans=τ(1)+τ(2)+τ(3)+τ(4)+τ(5)+τ(6)+τ(7)+τ(8)+τ(9)+τ(10)+τ(11)+τ(12)ans=τ(1)+τ(2)+τ(3)+τ(4)+τ(5)+τ(6)+τ(7)+τ(8)+τ(9)+τ(10)+τ(11)+τ(12)
ans=1+2+2+3+2+4+2+4+3+4+2+6ans=1+2+2+3+2+4+2+4+3+4+2+6
ans=1∗1+2∗5+3∗2+4∗3+6∗1ans=1∗1+2∗5+3∗2+4∗3+6∗1
ans=∑ni=1(ni)ans=∑i=1n(ni)
/*
* 求1到n的因子个数的和
*
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll n)
{
ll ans=0;
ll r;
for(ll l=1;l<=n;l=r+1)
{
r=n/(n/l);
ans+=n/l*(r-l+1);
//(n/l) 代表因子个数
//(r-l+1) 是有这个因子个数的区间长度
}
return ans;
}
int main()
{
ll n;
while(~scanf("%lld",&n))
printf("%lld\n",f(n));
return 0;
}
GCD和LCM
利用算术基本定理可以重新定义整数a和b的最大公因子gcd(a,b)gcd(a,b) 和最小公倍数lcm(a,b)lcm(a,b)
将a和b写成
所以a和b的最大公因数与最小公倍数可以写成这个形式,也可以由下边这个形式求得所以a和b的最大公因数与最小公倍数可以写成这个形式,也可以由下边这个形式求得
未完待续…