X-因子链(factor) \operatorname{X-因子链(factor)} X-因子链(factor)
题目链接: SSL比赛 1502 \operatorname{SSL比赛\ 1502} SSL比赛 1502
题目
给一个正整数
X
X
X ,一个长度为
m
m
m 的X-因子链是指这样一个序列:
X
0
=
1
X_0=1
X0=1 ,
X
1
X_1
X1 ,
X
2
X_2
X2 ,
。
。
。
。。。
。。。 ,
X
m
=
X
X_m=X
Xm=X 满足:
X
i
<
X
i
+
1
X_i<X_i+1
Xi<Xi+1 同时
X
i
∣
X
i
+
1
X_i|X_i+1
Xi∣Xi+1 (
X
i
+
1
X_i+1
Xi+1 能被
X
i
X_i
Xi 整除)
要求X-因子链的最大长度
L
e
n
Len
Len 和长度为
L
e
n
Len
Len 的X-因子链的数量。
输入
一个正整数 X X X
输出
一行,两个整数,分别表示最大长度和该长度链的种数。
样例输入
100
样例输出
4 6
数据范围
对于
20
%
20\%
20% 的数据:
X
<
=
20
,
000
;
X<=20,000;
X<=20,000;
对于
100
%
100\%
100% 的数据:
X
<
=
2
31
;
X<=2^{31};
X<=231; 且保证因子链最大长度小于等于
20
;
20;
20;
思路
这道题是一道数学题。
我们很容易可以发现,其实因子链的长度就是质因子的数量。
那接着就看方案数了,那其实就是一个全排列问题,可以得出公式:
a
n
s
=
n
u
m
!
a
1
!
∗
a
2
!
∗
.
.
.
∗
a
x
!
ans=\frac{num!}{a_1!*a_2!*...*a_x!}
ans=a1!∗a2!∗...∗ax!num!
(
n
u
m
num
num 为质因子的数量,
a
i
a_i
ai 为第
i
i
i 中质因子有多少个)
那就暴力算出来,就完事了。
代码
#include<cstdio>
#define ll long long
using namespace std;
ll x, su[50001], num, zhi[50001], ans = 1;
bool susu[50001];
int main() {
susu[0] = susu[1] = 1;//求出素数
for (ll i = 2; i <= 50000; i++)
if (!susu[i]) {
su[++su[0]] = i;
for (ll j = i + i; j <= 50000; j += i)
susu[j] = 1;
}
scanf("%lld", &x);//读入
for (ll i = 1; i <= su[0]; i++)
if (x % su[i] == 0) {
++zhi[0];
while (x % su[i] == 0) {//分解质因数
x /= su[i];
num++;
zhi[zhi[0]]++;
}
}
printf("%lld ", num);//输出
for (ll i = 2; i <= num; i++)//求出组合方案
ans *= i;
for (ll i = 1; i <= zhi[0]; i++) {
for (int j = 2; j <= zhi[i]; j++)
ans /= j;
}
printf("%lld", ans);//输出
return 0;
}