题目描述
输入正整数 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;
    }
}

 京公网安备 11010502036488号
京公网安备 11010502036488号