1. 程式人生 > 其它 >hdoj - 萌數的約數(數學問題)

hdoj - 萌數的約數(數學問題)

技術標籤: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/約數個數定理.