题目描述

输入正整数 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;

    }

}