一本通1628X-factor Chain

1628:X-factor Chain

时间限制: 1000 ms         内存限制: 524288 KB

【题目描述】

原题来自 POJ 3421

输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数。

【输入】

多组数据,每组数据一行,包含一个正整数 x

【输出】

对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。

【输入样例】

2
3
4
10
100

【输出样例】

1 1
1 1
2 1
2 2
4 6

【提示】

数据范围与提示:

对于全部数据,1x220

 

sol:看上去难系列

稍微想一下,发现是个排列组合一样的东西,又因为因数最多20,20!都没爆long long,随便搞搞

对于第 i 个质因数 有G[i] 个,一共有cnt个质因数

 

                    cnt

序列的最大长度Len就是     ∑ G[i]

                    i=1

 

            cnt

方案数就是Len!  /   ∏  G[i]!

            i=1

 

代码实现复杂度接近于0。。。。

Ps:吐槽这里的sigma好难用啊qaq

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0'); return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=1005;
ll n;
ll Ges[N];
int main()
{
    while(~scanf("%lld",&n))
    {
        ll i,nn=n,ans1=0,ans2=1;
        *Ges=0;
        for(i=2;i<=sqrt(nn);i++) if(nn%i==0)
        {
            ll tmp=1;
            Ges[++*Ges]=0;
            while(nn%i==0)
            {
                nn/=i;
                tmp*=(++Ges[*Ges]);
                ans2*=(++ans1);
            }
            ans2/=tmp;
        }
        if(nn>1)
        {
            Ges[++*Ges]=1; ans1++; ans2*=ans1;
        }
        W(ans1); Wl(ans2);
    }
    return 0;
}
View Code

 

posted @ 2019-02-25 21:57  yccdu  阅读(324)  评论(0编辑  收藏  举报