因子链:将一个数X分解成从1到X的数列,前一个数可以整除后一个数,求最大链长和链的个数。
比如10的约数是2和5各一个,那么最大链长就是2,到底有几个链呢?其实就是质因子们的排列组合——∏(质因子个数的阶乘)/(每个质因子的个数的阶乘)。只要我把它们排好了,顺序乘起来就能得到一条独一无二的链。
比如 100 =2*5*2*5 四就是最长子集 其中有2525 5252 2255 5522 2552 5225 四种
2 3 3 4 排列有2 3 3 4
2 3 4 3
2 4 3 3
3 2 3 4
3 4 3 2
3 3 2 4
3 3 4 2
3 2 4 3
3 4 2 3
4 2 3 3
4 3 2 3
4 3 3 2
12种排列方式
数学规律是 ∏(质因子个数的阶乘)/(每个质因子的个数的阶乘)
#include <bits/stdc++.h>
using namespace std;
int factor(int n)
{
int res=1;
for(int i=1;i<=n;i++)
{
res*=i;
}
return res;
}
vector<int> prim_factor_time(int n)
{
vector<int> res;
for(int i=2;i*i<=n;i++)
{
int time=0;
while(n%i==0)
{
++time;
n/=i;
}
res.push_back(time);
}
if(n!=1)
{
res.push_back(1);
}
return res;
}
int main()
{
int x;
while(cin>>x)
{
vector<int> f = prim_factor_time(x);
int length = accumulate(f.begin(), f.end(), 0); // 幂之和是长度
int number = factor(length); // 全排列
for (vector<int>::const_iterator it = f.begin(); it != f.end(); ++it)
{
number /= factor(*it); // 去重复
}
cout << length << ' ' << number << endl;
}
return 0;
}
参考
点击打开链接