【代码超详解】POJ 3421 X-factor Chains(分解质因数 + 简单排列组合,附模板)

博客探讨了POJ 3421问题,涉及分解质因数和排列组合。算法分析指出,通过质因数的乘积构建最长因数链,最长链的个数等于所有质因数排列数的计算。AC代码展示了79ms的解决方案,同时指出了分解质因数模板存在的问题。
摘要由CSDN通过智能技术生成

本题的分解质因数模板存在问题,已作废

————————————————————————————————————————————

一、题目描述

已知 X 的因数链是由 X0,X1,……,Xm 构成的数列,记其长度为 m 。其中 X0 = 1,Xm = X。从第二项开始,每一项都能被前一项整除。
输入一个整数 X,X < 2^20。
一行输出 2 个数,分别是:因数链的最长长度,最长的因数链的条数。
样例:
输入

2
3
4
10
100

输出

1 1
1 1
2 1
2 2
4 6

二、算法分析说明与代码编写指导

将数 X 写成一系列质因数的积在这里插入图片描述。要构造最长的因数链,只需要将每个质因数依次相乘(该质因数的次数是几,就要乘几个该质因数),就得到了该链。
例如:100 = 2 × 2 × 5 × 5。
于是最长的因数链是:1,2,4,20,100,长度为 4。
最长因数链的个数等于全体质因数的排列数在这里插入图片描述
例如:100 的最长因数链的个数是:4!/(2!2!)= 6。
两个 2 和两个 5 共有 4 × 3 × 2 × 1 = 24 种排列,但是当两个 2 和两个 5 各自按不同的排列调换顺序时,相应的因数链是相同的。所以这部分要扣除,100 的最长因数链只有 6 条。

三、AC 代码(79 ms)

吐槽一句,分解质因数的函数 pfact 里,

static map<_Ty, _Ty>::iterator D;

一句无法被 POJ 的编译器识别,只好配合质数表改成 unsigned 类型。

#include<cstdio>
#include<algorithm>
#include<map>
#include<cmath>
#pragma warning(disable:4996)
using namespace std;
unsigned long long fact[21] = {
    1,1 }, a, b, c; unsigned x; map<unsigned, unsigned> p;
unsigned prime[200] = {
    2,3 }, _PTy, MaxPrime, * prime_end = prime + sizeof(prime) / sizeof(prime[0]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值