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 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=1∏k(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
例 正整數 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/約數個數定理.