Files
python/TangDou/AcWing_TiGao/T5/YueShuGeShu/198.cpp

45 lines
1.8 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#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;
}