题目描述
给一个正整数X,一个长度为m的X-因子链是指这样一个序列:X0=1,X1,X2,。。。,Xm=X满足:Xi<Xi+1同时Xi|Xi+1(Xi+1能被Xi整除)
要求X-因子链的最大长度Len和长度为Len的X-因子链的数量。
输入
一个正整数X
输出
一行,两个整数,分别表示最大长度和该长度链的种数。
输入样例复制
100
输出样例复制
4 6
说明
对于20%的数据:X<=20,000;
对于100%的数据:X<=2^31;且保证因子链最大长度小于等于20;
.
.
.
.
.
.
分析
最长的长度取决于质因数的个数,也就是第一问答案len。
最长长度的个数相当于把最长质因数的排列个数。而有相同元素的排列数等于(len!)/(相同元素重复个数)!
例如100=225*5,第二位答案就是4!/(2!*2!)=6。两个2!分别表示2因子与5因子出现了两次,出现几次就除以几的阶乘。
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long maxn=(1<<20)+10;
bool b[maxn];
int prime[maxn],p[maxn],cnt;
int main ()
{
memset(b,true,sizeof(b));
b[1]=false;
for (int i=2;i<=maxn;i++)
for (int j=2;i*j<=maxn;j++)
b[i*j]=false;
for (int i=2;i<=maxn;i++)
if (b[i]==true) prime[++cnt]=i;
long long x,now,ans=0;
cin>>x;
for (int i=1;i<=cnt;i++)
if (x==1)
{
now=i;
break;
} else
{
while (x%prime[i]==0&&x>0)
{
x/=prime[i];
p[i]++;
ans++;
}
}
cout<<ans<<" ";
long long a1=1;
for (long long i=1;i<=ans;i++)
a1*=i;
for (int i=1;i<=now;i++)
if (p[i])
{
for (long long j=2;j<=p[i];j++)
a1/=j;
}
cout<<a1;
return 0;
}