反素数(用空多看一下)

题目: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的最大的反素数。

输入格式
一个正整数N。

输出格式
一个整数,表示不超过N的最大反素数。

数据范围
1≤N≤2∗109

解析: 找一个数,满足他的约数的个数是最多的,并且在约数个数相同的情况下,他是最小的(不然会存在跟他相等的约数但是比他小,这是不符合的)
通过 Dfs一个一个试所有情况。

每个数可以写成:p1(c1的幂)* p2(c2的幂) ****** pr(cr的幂)
约数的个数: (c1 + 1) * (c2 + 1) * (c3 + 1)****** (cr + 1)
约数的和: 约数的和,在百度搜的
代码:

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e6 + 50;
const int INF = 0x3f3f3f3f;
typedef long long ll;

int n, ans, sum;
int prime[] = {
    
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

inline void Dfs(int u, int last, int p, int s) // (第几个质数, 这个数的最大次幂, 这个数是多大, 约数的个数)
{
    
    
    if (s > sum || (s == sum && p < ans)) {
    
    
        ans = p, sum = s;
    }
    for (int i = 1; i <= last; i++) {
    
    
        if ((ll)p * prime[u] > n) break;
        p *= prime[u];
        Dfs(u + 1, i, p, s * (i + 1));
    }
}

int main()
{
    
    
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    cin >> n;

    Dfs(0, 30, 1, 1);

    cout << ans << endl;

    return 0;
}

おすすめ

転載: blog.csdn.net/YingShen_xyz/article/details/112837760