最大因子链
输入正整数 X,求 X 的大于 1
的因子组成的满足任意前一项都能整除后一项的严格递增序列的最大长度,以及满足最大长度的序列的个数。
输入格式
输入包含多组数据,每组数据占一行,包含一个正整数表示 X
。
输出格式
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。
每个结果占一行。
数据范围
1≤X≤220
输入样例:
2
3
4
10
100
输出样例:
1 1
1 1
2 1
2 2
4 6
#include<bits/stdc++.h>
using namespace std;
const int N=(1<<20) +10;
int primes[N],cnt,minp[N];
bool st[N]; void get_primes()
{
for(int i=2;i<=N-1;i++)
{
if(!st[i])
{
primes[cnt++]=i;
minp[i]=i;
}
for(int j=0;primes[j]*i<=N-1;j++)
{
st[i*primes[j]]=1;
minp[i*primes[j]]=primes[j];
if(i%primes[j]==0) break;
}
}
}
int main()
{
int x;
get_primes(); while(scanf("%d",&x)!=EOF)
{
int k=0;
int tot=0; int fact[30]={
0}; while(x>1)
{
int t=minp[x]; while(x%t==0)
{
x/=t;
tot++;
fact[k]++;
if(x==1) break;
}
k++;
}
long long res=1;
for(int i=2;i<=tot;i++)
res*=i;
for(int i=0;i<k;i++)
for(int j=1;j<=fact[i];j++)
res/=j;
printf("%d %lld\n",tot,res);
}
return 0;
}