
因子链:将一个数X分解成从1到X的数列,前一个数可以整除后一个数,求最大链长和链的个数。
2.6 数学问题的解题窍门
素数
比如10的约数是2和5各一个,那么最大链长就是2,到底有几个链呢?其实就是质因子们的排列组合——∏(质因子个数的阶乘)/(每个质因子的个数的阶乘)。只要我把它们排好了,顺序乘起来就能得到一条独一无二的链。
下面的代码里有很多模板,其实只用了后两个,其它的懒得删了
#ifndef ONLINE_JUDGE
#pragma warning(disable : 4996)
#endif
#include <iostream>
#include <vector>
#include <numeric>
#include <map>
using namespace std;
typedef unsigned long long ULL;
//************************************
// Method: divisor
// FullName: divisor
// Access: public
// Returns: vector<int> 约数
// Qualifier: 约数枚举
// Parameter: const int & n 目标数n
//************************************
vector<int> divisor(const int& n)
{
vector<int> res;
for (int i = 1; i * i <= n; ++i)
{
if (n % i == 0)
{
res.push_back(i);
if (i != n / i)
{
res.push_back(n / i);
}
}
}
return res;
}
//************************************
// Method: prime_factor
// FullName: prime_factor
// Access: public
// Returns: map<int, int>
// Qualifier: 整数分解
// Parameter: int n
//************************************
map<int, int> prime_factor(int n)
{
map<int, int> res;
for (int i = 2; i * i <= n; ++i)
{
while (n % i == 0)
{
++res[i];
n /= i;
}
}
if (n != 1)
{
res[n] = 1;
}
return res;
}
//************************************
// Method: prime_factor_time
// FullName: prime_factor_time
// Access: public
// Returns: vector<int>
// Qualifier: 只求解整数分解的因子的幂
// Parameter: int n
//************************************
vector<int> prime_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;
}
//************************************
// Method: factor
// FullName: factor
// Access: public
// Returns: int
// Qualifier: 阶乘,n!
// Parameter: const int & n
//************************************
ULL factor(const int& n)
{
ULL res = 1;
for (int i = 1; i <= n; ++i)
{
res *= i;
}
return res;
}
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int X;
while (cin >> X)
{
vector<int> f = prime_factor_time(X);
int length = accumulate(f.begin(), f.end(), 0); // 幂之和是长度
ULL number = factor(length); // 全排列
for (vector<int>::const_iterator it = f.begin(); it != f.end(); ++it)
{
number /= factor(*it); // 去重复
}
cout << length << ' ' << number << endl;
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif
return 0;
}
///////////////////////////End Sub//////////////////////////////////
知识共享署名-非商业性使用-相同方式共享:码农场 » POJ 3421 X-factor Chains 题解 《挑战程序设计竞赛》
码农场