约数个数定理:
我们分解质因数 :则
当
取得不同的值时,每个质因子取不同的值,
,个数为(
)
则 n 的约数个数为
//用 d表示约数个数, 表示pr的最小质因子出现次数。
void countprime(int n)
{
st[1] = true;
d[1] = 1;
for(int i=2;i<=n;i++)
{
//是质数
if(!st[i])
{
prime[k++] = i;
pr[i] = 1; //最小质因子出现一次
d[i] = 2; //约数个数 2个 (1 和 prime[k])
}
for(int j = 0;prime[j] <= n /i ;j++)
{
st[prime[j] * i] = true;
//i % prime[j] == 0 说明prime[j] 不仅是 i 的最小质因子,也是 i * prime[j] 的最小质因子
//最小质因子出现的次数 + 1; 约数个数方面,我们仅考虑 prime[j] 这个质因子 ,其他质因子不受影响
//我们只需更新这个质因子的次数,首先我们要除掉之前的次数 + 1,然后再乘上现在的次数 + 1;
if(i % prime[j] == 0)
{
pr[prime[j] * i] = pr[i] + 1;
d[prime[j] * i] = d[i] / pr[i * prime[j]] * (pr[i * prime[j]] +1);
break;
}
//i % prime[j] != 0 则之前的次数没有影响,我们只需乘上新加入的质因子的次数 +1(等于 2),即可。
else
{
pr[prime[j] * i] = 1;
d[i * prime[j]] = d[i] * 2;
}
}
}
}