P1463 [POI2001][HAOI2007]反素数
详解见代码注释
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
const int mod = 1073741824;
#define int long long
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int prime[15] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43};
int n, res, ma;
void dfs(int num, int sumys, int zsid) ///求的是约数的个数尽可能多且数尽可能小
{ ///num=当前数,sumys=约数个数,zsid=质数编号
if (sumys > ma || (sumys == ma && num < res))
res = num, ma = sumys; ///碰见约数更多的或者约数一样却更小的,更新答案
int i = 0, tmpnum = num;
while (i < 32)
{
i++;
if (n / tmpnum < prime[zsid]) ///超出n则返回
return;
tmpnum = tmpnum * prime[zsid]; ///num更新
if (tmpnum < n)
dfs(tmpnum, sumys * (i + 1), zsid + 1); ///深层递归
///注意到返回递归时sumys会“自动退回”
}
}
signed main()
{
IOS;
cin >> n;
dfs(1, 1, 1);
cout << res << endl;
}