bzoj1053(反素数)

4790: Lydsy1053 反素数

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 7  Solved: 5
[Submit][Status][Web Board]

Description

对于任何正整数 x,其约数的个数记作g(x)。例如g(1)=1,g(6)=4。
如果某个正整数 x 满足:对于任意的 0<i<x,都有 g(x)>g(i),那么称 x 为反质数。例如整数 1,2,4,6 等都是反质数。
现在给定一个数 N(1≤N≤2*〖10〗^9 ),请求出不超过N的最大的反质数。

Input

一个数N(1<=N<=2,000,000,000)。

Output

不超过N的最大的反质数。

Sample Input

1000

Sample Output

840

HINT

Source

引理:1~n中最大的反素数,就是1~n中约数个数最多的数中最小的一个

1~n中的任意数x,的约数不可能超过十个

对于x属于1~n,若x为反素数,则将x质因数分解后次方单调递减

所以,直接爆搜

#include<cstdio>
using namespace std;

typedef  long long ll;

int s[100];
int ansnum,anssum;
int n;
int prime[20]={1,2,3,5,7,11,13,17,19,22,23,29,31};

void dfs(ll num,ll sum,int x){//num为约数个数,sum为现在总和,x为到第几个素数
     if(x>12) return ;
     if(num>ansnum || (num==ansnum&&sum<anssum)){
        ansnum=num;
        anssum=sum;
        //return ;
     }
     s[x]=0;
     while(sum*prime[x]<=n&&s[x]<s[x-1]){
        s[x]++;
        //ll next=num*(s[x]+1);
        dfs(num*(s[x]+1),sum*=prime[x],x+1);
     }
}

int main(){
    scanf("%d",&n);
    s[0]=10000;
    dfs(1,1,1);
    printf("%d\n",anssum);
return 0;
}

 

posted @ 2018-05-22 19:12  lmjer  阅读(172)  评论(0编辑  收藏  举报