题目大意:
题意一开始做的时候有点模糊,首先明确是要对X求一个数列,满足前一个小于后一个,且前一个能被后一个整除,寻求最长数列的长度,这个我们可以通过素因子来排查,对于x的素因子,只要少一个就可以满足前一个小于后一个且能被整除的关系,所以我们如果知道了素因子的个数和,那么最长链的长度也就知道了。但是还有一问,就是,问有多少个,这个我就没太看懂题目的意思,我以为是这种长度且满足条件的链有多少个,想来想去也就只有一个,而且网上都说是排列组合,我一直想不通,后来才发现是求这种长度的串有多少个,而不需要满足关系,因此也就是一个给定n个数求n个数的排列组合的问题;
AC代码:
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <bitset>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <fstream>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define maxn 1010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ms(x,y) memset(x,y,sizeof(x))
#define rep(i,n) for(int i=0;i<(n);i++)
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
#define PI pair<int,int>
//#define mp make_pair
#define FI first
#define SE second
#define IT iterator
#define PB push_back
#define Times 10
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int ,int > P;
//#define N 100
const double eps = 1e-10;
const double pi = acos(-1.0);
const ll mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const ll INF = (ll)1e18+300;
const int maxd = 51000 + 10;
ll fac[23];
void init() {
fac[0] = 1;
for (int i = 1; i <= 22; i++) {
fac[i] = i;
fac[i] = fac[i] * fac[i - 1];
}
}
int main() {
ll x;
init();
while(cin >> x) {
ll ans = 0;
ll cnt = 1;
ll cns = 0;
for (ll i = 2; i*i <= x; i++) {
if(x % i == 0) {
int num = 0;
while(x % i == 0) {
x /= i;
num ++ ;
}
ans += num;
cnt *= fac[num];
//cout << ans << " " << fac[ans] << " " << cnt << endl;
}
}
if(x > 1) {
ans += 1;
}
cout << ans << " " << fac[ans] / cnt << endl;
}
}