数的因子数
一、唯一分解定理
利用公式进行求解
int num_prime(int x)
{
Prime();
int ans = 1;
for (int i = 1; i < prime[0]; i++)
{
if (prime[i] > sqrt(x))
break;
int sum = 0;
while (x%prime[i]==0)
{
x /= prime[i];
sum++;
}
ans *= (sum + 1);
}
if (x != 1)
ans *= 2;
return ans;
}
二、整除分块
可将因数和转化为求[n/k]的前n项。
#include <stdio.h>
#define ll long long
ll integer(ll n)
{//[n/k] k=1——n 取整结果 O(sqrt(n))
ll sum = 0;
for (ll l = 1, r = 1; l <= n; l = r + 1)
{
r = n / (n / l);
sum += n / l * (r - l + 1);
}
return sum;
}
ll div(ll n)
{
return n == 1 ? 1 : integer(n) - integer(n - 1);
}
int main()
{
int N = 100;
for (int i = 1; i <= N; i++)
printf("数%3d的因子个数为%3lld\n", i,div(i));
return 0;
}
推广:
对于n%i,可化为n-[n/i]*i
显然后面的可以用整除分块的思路去求
ll integer_change(ll n)
{//[n/k]*k 其中k=1——n O(sqrt(n))
ll sum = 0;
for (ll l = 1, r = 1; l <= n; l = r + 1)
{
r = n / (n / l);
sum += n / l * (r - l + 1) * (l + r) / 2;
}
return sum;
}