题意:
给你一个X,令X0等于1,Xm等于X;
然后是一个序列:X0,X1,,,Xm;
Xi < X(i+1),Xi整除X(i+1)(即从X0到Xm都是X的因子);
让你求这个序列的最大长度,和在这个长度下的序列种数;
理解:
开始我是直接枚举深搜,但提交超时,主要是题目的数据大吧,,,
方法:(网上的方法我确实不能理解)
主要理解为质因子分解,因为后面的Xi是前面质因子乘起来的;
这样有多少个质因子就能组成好长的序列;
种类数就是这些质因子的组合;
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
using namespace std;
#define maxn 100100
#define x first
#define y second
#define ll long long
#define P pair<int, int>
ll Factor(ll a) //阶乘
{
ll sum = 1;
for (int i = 2; i <= a; ++i)
sum *= i;
return sum;
}
int main()
{
int n;
while(~scanf("%d", &n))
{
ll Hash[maxn/100 * 2] = {0};
int ans1 = 0;
for (int i = 2; i * i <= n; ++i) //枚举因子
{
while(n % i == 0)
{
++Hash[i];
n /= i;
++ans1;
}
}
if (n != 1) ++ans1;
ll ans2 = Factor(ans1);
for (int i = 2; i < maxn/100 * 2; ++i)//组合的算法
{
if (Hash[i])
{
ans2 /= Factor(Hash[i]);
}
}
printf("%d %lld\n", ans1 == 0 ? 1 : ans1, ans2);
}
return 0;
}