45 lines
1.8 KiB
C++
45 lines
1.8 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
#define endl "\n"
|
||
#define int long long
|
||
const int N = 2e9;
|
||
|
||
int n;
|
||
int primes[9] = {2, 3, 5, 7, 11, 13, 17, 19, 23}; // 枚举的质数前9位,足够了
|
||
int mc, mx; // 最大反素数的约数个数,最大反素数值
|
||
|
||
/*
|
||
u:走到数组primes的第几位
|
||
last:前一个质数,我们取的指数是多少,当前位置取的质数的指数需要小于等于last
|
||
tmx: 当前路线上取得的最大反素数
|
||
tmc: 当前路线上取得的约数个数
|
||
*/
|
||
void dfs(int u, int last, int tmx, int tmc) {
|
||
if (u == 9) { // 走完全程
|
||
// ① 当前路径中约数个数大于最大约数个数,需要替换
|
||
// ② 当前路径中的约数个数等于最大约数个数,但是,当前路径的数值更小,也需要替换
|
||
if (tmc > mc || (tmc == mc && tmx < mx))
|
||
mc = tmc, mx = tmx;
|
||
return;
|
||
}
|
||
|
||
for (int i = 0; i <= last; i++) { // 幂次只能是小于等于前一个数的幂次
|
||
int k = pow(primes[u], i);
|
||
if (k * tmx > n) break; // 如果取当前这个素数的i次方,乘到原来的最大值后,大于n,那么此路径不通
|
||
|
||
/*
|
||
u+1:下一个素数位置
|
||
i: 当前u这个素数取了i次幂
|
||
tmx*k : 因为取了i次幂,所以,最大值变大了k倍
|
||
tmc*(i+1) : 根据约数个数公式,因为有了质数 primes[u]后,取了i次幂,那么约数和增加(i+1)倍
|
||
*/
|
||
dfs(u + 1, i, tmx * k, tmc * (i + 1));
|
||
}
|
||
}
|
||
|
||
signed main() {
|
||
cin >> n;
|
||
dfs(0, 30, 1, 1); // 从最小的质数2出发,最大的幂次不超过30
|
||
// n的最小取值是1,也就是小于等于1的范围内,最小的反素数是1,而且,约数的个数也是1
|
||
cout << mx << endl;
|
||
} |