X-factor Chains POJ - 3421(素数+排列)

题目链接:X-factor Chains - POJ 3421 - Virtual Judge

大体意思就是质因数分解,找最多能被多少个数分解而且较小的一个数能够整除大一位的数,这样构成的数列才是题目所要求的数列长度,长度不包括1,比如100,可以分成2*2*5*5,所以数列最长为4,这四个数的全排列就是4的阶乘除以2的阶乘再除以2的阶乘,说白了,就是通过不同的数列使得最后能到100,①2 2 5 5:2 4 20 100 ②:2 5 5 2 : 2 10 50 100...以此类推,100不是质数的情况,假如是一个质数,那么能够整除的只有1和他本身,但所求的数列长度就是1,得到的质因数也是1,为了防止TLE,要先预处理出阶乘

AC代码:

#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <numeric>
#include <iomanip>
using namespace std;
const int INF = 0x3f3f3f3f;
int n;
long long fac[23] = { 1 };
void init() {
	for (int i = 1; i <= 22; i++) {
		fac[i] = fac[i - 1] * i;
	}
	return;
}
void solve() {
	long long fc = 0, de = 1;
	for (long long i = 2; i * i <= n; i++) {
		if (n % i == 0) {
			int ec = 0;
			while (n % i == 0) {
				ec++;
				n /= i;
			}
			fc += ec;
			de *= fac[ec];
		}
	}
	if (n > 1) {
		fc += 1;
	}
	cout << fc << " " << fac[fc] / de << endl;
	return;
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	init();
	while (cin >> n) {
		solve();
	}
	return 0;
}
/*

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值