反素数

题目链接

题解:求一个1到n以内的数,使得这个数有最多的约数。如果有多解,只找最小的那个

因为要严格满足对于任意1<=i<=n,有g(x) > g(i),所以如果有g(i)=g(j)且i<=j,那么i是符合题意的,但是j是不符合的。因为g(j)>g(i)不满足

至于一个数的约数个数,把它分解质因数,假设是p1^q1 * p2^q2 * p3^q3……*pi^qi,那么约数个数是(q1+1)*(q2+1)*(q3+1)……*(qi+1)。

预处理出前10个质数直接暴搜就好了。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<map>
#include<vector>
#include<queue>
#define ll long long
#define INF 2e9 
using namespace std;
ll a[12]={0,2,3,5,7,11,13,17,19,23,29,31};
ll c[11];
ll ans=INF,n,k=1;
void dfs(ll now, ll num, ll cnt)
{
    if (now==11) 
    {
        if (cnt>k || (cnt==k && ans>num))
        {
            k=cnt;
            ans=num;
        }
        return;
    }
    ll num_cnt=num;
    for (int i=0;i<=c[now-1];i++)
    {
        if (num_cnt>n)
            return;
        c[now]=i;
        dfs(now+1,num_cnt,cnt*(i+1));
        num_cnt*=a[now];
    }
}
int main()
{
    scanf("%lld",&n);
    c[0]=INF;
    dfs(1,1,1);
    printf("%lld\n",ans);
 } 

 

posted @ 2019-08-04 21:29  Ldler  Views(255)  Comments(0Edit  收藏  举报