0
点赞
收藏
分享

微信扫一扫

洛谷P1463 [POI2001][HAOI2007]反素数

阎小妍 2022-04-04 阅读 35
算法

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;
}
举报

相关推荐

0 条评论