题意:给一个数,求这个数X的因子组成的长度最长长度m(在X1 = 1,X2,X3,,,,Xm = X,Xi+1>X1&&Xi+1%Xi==0的情况下)。
题解:任何一个数都可以由素数相乘组成,所以可以将这个数的因子中的素数找出来。
具体的数目就是这些素因子的排列组合的数目,比如100=2*2*5*5,素因子4个,排列组合次数为4!/(2!*2!) = 6,就是简单的组合数学
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <cstring>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define ull unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
ull a[23];
void init(){
a[0] = 1;
for(int i = 1; i <= 22 ; i++){
a[i] = a[i-1]*i;
// cout<<a[i]<<" "<<i<<endl;
}
}
int main(){
init();
int x;
while(cin>>x){
ull fz = 0,fm = 1;
for(int i = 2 ; i*i <= x;i++){
if(x%i==0){
int count = 0;
while(x%i==0){
count++;
x/=i;
}
fz += count;
fm *= a[count];
}
}
if(x>1) fz++;
cout<<fz<<" "<<a[fz]/fm<<endl;
}
}