链接:
https://www.acwing.com/problem/content/200/
题意:
对于任何正整数x,其约数的个数记作g(x),例如g(1)=1、g(6)=4。
如果某个正整数x满足:对于任意的小于x的正整数 i,都有g(x)>g(i) ,则称x为反素数。
例如,整数1,2,4,6等都是反素数。
现在给定一个数N,请求出不超过N的最大的反素数。
思路:
考虑前11个素数的乘积大于2e9, 可以对n用前10个质数进行质数分解.
考虑2^31 > 2e9. 然后限制一下范围, DFS跑一遍.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXV = 2e9;
int Pri[20] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
int Cnt[20];
LL cnt, res, n;
LL Pow(LL a, int b)
{
LL tmp = 1;
while (b > 0)
{
if (b&1)
tmp *= a;
a *= a;
b >>= 1;
}
return tmp;
}
void Dfs(int step, LL val)
{
// cout << step << ' ' << val << endl;
if (step > 10)
{
LL tmp = 1;
for (int i = 1;i <= 10;i++)
tmp *= (Cnt[i]+1);
if (tmp > cnt)
{
cnt = tmp;
res = val;
}
else if (tmp == cnt && val < res)
{
cnt = tmp;
res = val;
}
return;
}
for (int i = 0;i <= 30;i++)
{
if (val*Pow(Pri[step], i) > n)
break;
Cnt[step] = i;
Dfs(step+1, val*Pow(Pri[step], i));
}
}
int main()
{
memset(Cnt, 0, sizeof(Cnt));
scanf("%lld", &n);
if (n == 1)
{
puts("1");
return 0;
}
Dfs(1, 1);
printf("%lld\n", res);
return 0;
}