约数个数模板

假设 n n n 可以表示为 n = P 1 α 1 ∗ P 2 α 2 ∗ . . . ∗ P k α k n=P_1^{\alpha_1}*P_2^{\alpha_2}*...*P_k^{\alpha_k} n=P1α1P2α2...Pkαk,其中 P i P_i Pi 均为 n n n 的质因子,那么存在结论 n n n 的约数的个数为 ( α 1 + 1 ) ∗ ( α 2 + 1 ) ∗ . . . ∗ ( α k + 1 ) (\alpha_1+1)*(\alpha_2+1)*...*(\alpha_k+1) (α1+1)(α2+1)...(αk+1)

大致证明如下:由于每一个数均可由某些质数的若干次幂的乘积构成,且不同质数的不同次幂会构成不同的数,即一一对应关系,因此对于 m = P 1 β 1 ∗ P 2 β 2 ∗ . . . ∗ P k β k m=P_1^{\beta_1}*P_2^{\beta_2}*...*P_k^{\beta_k} m=P1β1P2β2...Pkβk 0 ≤ β i ≤ α i 0≤\beta_i≤\alpha_i 0βiαi,即 β i \beta_i βi 存在 α i + 1 \alpha_i+1 αi+1 种选择,所以构成数的总个数为 ( α 1 + 1 ) ∗ ( α 2 + 1 ) ∗ . . . ∗ ( α k + 1 ) (\alpha_1+1)*(\alpha_2+1)*...*(\alpha_k+1) (α1+1)(α2+1)...(αk+1)。又因为 m m m 必然整除 n n n,所以 ( α 1 + 1 ) ∗ ( α 2 + 1 ) ∗ . . . ∗ ( α k + 1 ) (\alpha_1+1)*(\alpha_2+1)*...*(\alpha_k+1) (α1+1)(α2+1)...(αk+1) 即为 n n n 的约数个数。

问题转化为了分解质因数。


#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n, ans = 1;
	cin >> n;
	
	for (int i = 2;i * i <= n;i ++) {
		if (n % i == 0) {
			int cnt = 1;
			while (n % i == 0) n /= i, cnt ++;
			ans *= cnt;
		}
	}
	if (n > 1) ans *= 2;
	cout << ans << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不牌不改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值