题目描述
输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数。
输入
多组数据,每组数据一行,包含一个正整数 x。
对于全部数据,1≤x≤220。
输出
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。
样例输入
2
3
4
10
100
样例输出
1 1
1 1
2 1
2 2
4 6
思路:显然答案为多重集的排列数。设S={n1∗a1,n2∗a2,..,nk∗ak} 全排列的个数为n!/(n1!+n2!......+nk!)
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
long long fac[22]={0,1};
for(int i=2;i<=20;i++)//首先我们先将阶乘打好
{
fac[i]=fac[i-1]*i;
}
while(scanf("%d",&n)!=EOF)
{
long long sum=1,len=0;
for(int i=2;i*i<=n;i++)
{
int cnt=0;//cnt代表因子数
if(n%i==0)
{
while(n%i==0)
{
n/=i;
cnt++;
}
sum*=fac[cnt];//乘上其相应的阶乘
len+=cnt;记入长度
}
}
if(n>1)
len++;
cout<<len<<" "<<fac[len]/sum<<endl;
}
}