因子数——唯一分解定理和整除分块

数的因子数
一、唯一分解定理
在这里插入图片描述利用公式进行求解

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值