SSLOJ 1502 X-因子链 factor
Description–
给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0 = 1,X1,X2,。。。,Xm=X满足:Xi < Xi + 1同时Xi | Xi + 1 (Xi + 1能被Xi整除)
要求X-因子链的最大长度Len和长度为Len的X-因子链的数量。
Input–
一个正整数X
Output–
一行,两个整数,分别表示最大长度和该长度链的种数。
Sample Input–
100
Sample Output–
4 6
说明–
对于20%的数据:X<=20,000;
对于100%的数据:X<=2^31;且保证因子链最大长度小于等于20;
解题思路–
质因数: x2 x2 x5 x5
预处理阶乘 --> 分解质因数(长度len)(1 ---- 2 ---- 4 ---- 20 ---- 100) --> 求相同质因数的个数的阶乘之积
代码–
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll n, o, c, ans, x[30];
void ycl() //预处理阶乘
{
x[1] = 1;
for (ll i = 2; i <= 20; ++i)
x[i] = x[i - 1] * i;
}
int main()
{
ycl(), c = 1;
scanf("%lld", &n);
for (ll i = 2; i <= n; ++i)
if (n % i == 0)
{
o = 0;
while (n % i == 0)
o++, n /= i;
ans += o, c *= x[o]; //ans为质因数个数,c为相同质因数的个数的阶乘之积
}
printf("%lld %lld", ans, x[ans] / c);
return 0;
}