整除
一.整除的概念
若整数a除以非零整数b,商为整数,且余数为零,我们就说a能被b整数(或者说b整除a)。如:.a | b 读作a整除b(或b能被a整除)。“ | ”是整除符号。
二.整除的基本性质
1.若a|b,b|a,则b=a或b=-a
2.若a|b,b|c,则a|c(传递性)
3.若a|b,b|c,则对于任意整数x,y都有a|bx+cy
三.算数基本定理
算术基本定理,又称为正整数的唯一分解定理。即:每个大于1的自然数,若不是本身就是质数,就是可写为2个以上的质数的积,而且这些质因子按大小排列之后,写法仅有一种方式。
四.约数个数定理
对于一个大于1的正整数n可以分解质因数:
则n的正约数的个数就是
其中a1、a2、a3…ak是p1、p2、p3…pk的指数。
五.约数和原理
由算术基本定理可知,对于一个大于1的正整数n可以分解质因数:
则由约数个数定理可知n的正约数有
个,那么n的d(n)个正约数的和为
再由等比数列求和公式可知,上式亦可写成:
六.代码
1.试除法求所有约数
vector<int> get_divisors(int n)
{
vector<int> res;
for(int i=1;i<=n/i;i++)
{
if(n%i==0)
{
res.push_back(i);
if(i!=n/i)
res.push_back(n/i);
}
}
sort(res.begin(),res.end());//根据题面排序
return res;
}
2.约数个数
for(int i=2;i<=n/i;i++)
{
while(n%i==0)
{
n/=i;
primes[i]++;//或用两个数组取代primes[cnt]=i;
}//primes_num[cnt]++;
if(x>1) primes[n]++;//一样可以用两个数组取代
long long res=1;
for(auto prime:primes)
res*=prime.second+1;
cout<<res;
}
参考了百度