hdoj - 萌数的约数(数学问题)

题目描述

一个数,如果他的素数因子只包括2,3,5,7,则称这个数为萌数,比如,下面这些数就是前20个萌数:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27。

现在给你一个萌数,请编程计算它的约数的个数。

比如,4是一个萌数,他有3个约数(1,2,4);12也是一个萌数,他有 6 个约数(1,2,3,4,6,12)。

输入格式

输入包含多组测试用例。
每个测试用例包含一个萌数n, 并且n在64位整数的范围( long long 类型,输入输出用%lld )。
如果n为0,则标志结束输入,不做处理。

输出格式

对于每个测试用例中的萌数,请输出他的约数的个数。
每个输出占一行。

输入样例

4
12
0

输出样例

3
6

题意

求一个数约数的个数,且已知这个数分解后的素因子最多只有 2、3、5、7 四种。

解题思路

根据约数个数定理即可求出答案。该定理的表述如下:

约数个数定理 对于一个大于 1 1 1 的正整数 n n n 可以分解质因数

n = ∏ i = 1 k p i a i = p 1 a 1 ⋅ p 2 a 2 ⋅ ⋯ ⋅ p k a k n=\prod_{i=1}^k p_i^{a_i}=p_1^{a_1}\cdot p_2^{a_2}\cdot\cdots\cdot p_k^{a_k} n=i=1kpiai=p1a1p2a2pkak

n n n 的正约数的个数就是

f ( n ) = ∏ i = 1 k ( a i + 1 ) = ( a 1 + 1 ) ( a 2 + 1 ) ⋯ ( a k + 1 ) f(n)=\prod_{i=1}^k(a_i+1)=(a_1+1)(a_2+1)\cdots(a_k+1) f(n)=i=1k(ai+1)=(a1+1)(a2+1)(ak+1)

其中 a 1 a_1 a1 a 2 a_2 a2 a 3 . . . a k a_3 ... a_k a3...ak p 1 p_1 p1 p 2 p_2 p2 p 3 . . . p k p_3 ... p_k p3...pk 的指数。

正整数 378000 378000 378000 共有多少个正约数?

解:将 378000 378000 378000 分解质因数: 378000 = 2 4 × 3 3 × 5 3 × 7 1 378000 = 2^4 \times 3^3 \times 5^3 \times 7^1 378000=24×33×53×71

由约数个数定理可知 378000 378000 378000 共有正约数 ( 4 + 1 ) × ( 3 + 1 ) × ( 3 + 1 ) × ( 1 + 1 ) = 160 (4+1) \times (3+1) \times (3+1) \times (1+1) = 160 (4+1)×(3+1)×(3+1)×(1+1)=160 个。

程序代码

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

int main()
{
	long long n;
	while (true)
	{
		scanf("%lld", &n);
		if (n == 0)break;
		int cnt[4] = { 0 };   // 分别表示分解质因数后 2,3,5,7 的幂次

		while (true)
		{
			if (n % 2 == 0)
			{
				cnt[0]++;
				n /= 2;
				continue;
			}
			else if (n % 3 == 0)
			{
				cnt[1]++;
				n /= 3;
				continue;
			}
			else if (n % 5 == 0)
			{
				cnt[2]++;
				n /= 5;
				continue;
			}
			else if (n % 7 == 0)
			{
				cnt[3]++;
				n /= 7;
				continue;
			}

			break;
		}

		printf("%d\n", (cnt[0] + 1) * (cnt[1] + 1) * (cnt[2] + 1) * (cnt[3] + 1));
	}


	return 0;
}

【参考文献】

[1] 萌数的约数[EB/OL]. HDOJ, [2021-01-24].

[2] 约数个数定理[EB/OL]. 百度百科, (2020-05-06) [2021-01-24]. https://baike.baidu.com/item/约数个数定理.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页