POJ3421 X-factor Chains【分解质因子+组合数学】

问题链接POJ3421 X-factor Chains

题意简述:输入正整数x,求x的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及所有不同序列的个数。

问题分析

首先要对x进行因子分解。这样可以得到总的因子个数c,不同的因子为f1,f2,...,fn其次方数分别为e1,e2,...,en。那么,不同序列的个数为c!/(e1!e2!......en!)。

程序说明

数组factorial[],若factorial[i]=k则k=i!,即每个元素存放其下标的阶乘值。初始化将阶乘算出来打表,避免重复计算。

那个常量N取22是应为22!还能够存储在unsigned long long类型变量中,再大就已经无法存储了。

变量fcount存储x因子的数量,变量ecount存储各个因子的次方数(重复次数)。


AC的C++语言程序如下

/* POJ3421 X-factor Chains */

#include <iostream>

using namespace std;

typedef unsigned long long ULL;

const int N = 22;
ULL factorial[N+1] = {1};

void init(int n)
{
    for(int i=1; i<=n; i++)
        factorial[i] = factorial[i - 1] * i;
}

void solve(ULL x)
{
    ULL fcount=0, denominator=1;
    for(ULL i=2; i*i<=x; i++) {
        if(x % i == 0) {
            int ecount = 0;
            while(x % i == 0) {
                ecount++;
                x /= i;
            }
            fcount += ecount;
            denominator *= factorial[ecount];
        }
    }
    if(x > 1)
        fcount += 1;

   cout << fcount << " " << factorial[fcount] / denominator << endl;
}

int main()
{
    init(N);

    ULL x;
    while(cin >> x)
        solve(x);

    return 0;
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值