题目链接: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; } /* */