本题的分解质因数模板存在问题,已作废
————————————————————————————————————————————
一、题目描述
已知 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]);