zoj 2562 反素数

题意:给一个N,求不超过N的哪个数的因子数最多,数目相同的取值小的那个。

分析:反素数定义:g(i)表示 i 含有因子的数目,若小于x的任意数 i,都有 g(i)<g(x), 则x是一个反素数。

反素数特性: x = 2^t1 * 3^t2 * 5^t3 * 7^t4 .....

这里有 t1>=t2>=t3>=t4...            t1>0 t2>0 t3>0...

证明:如果ti<tj,其中i<j,由于pi小于pj,那么pi^tj*pj^ti<pi^ti*pj^tj,这样就出现了因子数目相同,但x更小的情况,与反素数的定义矛盾。

然后搜索。。

 

 

int p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};

long long lim;
long long n,c;

void dfs(int i,int Max,long long num,long long cnt){//第i个素数  可选Max个  当前积  当前因子数
    if(c==cnt)checkmin(n,num);
    else if(c<cnt){c=cnt;n=num;}

    if(i>14) return;

    FOE(j,1,Max){
        num*=p[i];
        if(num>lim) return;
        dfs(i+1,j,num,cnt*(j+1));
    }
}

int main(){
    while(cin>>lim){
        n=lim; c=1;
        dfs(0,50,1,1);
        cout<<n<<endl;
    }
    return 0;
}

 

posted @ 2013-05-29 23:00  心向往之  阅读(129)  评论(0编辑  收藏  举报