[swustoj 373] Antiprime数

Antiprime数(0373)

问题描述

如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数。譬如:1, 2, 4, 6, 12, 24。 
任务: 
编一个程序: 
计算不大于n的最大Antiprime数。 

输入

输入只有一个整数,n(1 <= n <= 2 000 000 000)

输出

输入只有一个整数,n(1 <= n <= 2 000 000 000)

样例输入

1000

样例输出

840

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define pb push_back
#define ll long long
#define INF 0x3f3f3f3f
#define N 2000000000

ll n;
ll res;
ll fac;
ll prime[]={2,3,5,7,11,13,17,19,23,29};

void dfs(ll x,ll y,ll z,ll last)
{
    if(x>=10){
        if(z>fac) res=y,fac=z;
        if(z==fac && y<res) res=y,fac=z;
        return;
    }
    for(ll i=0;i<=last;i++){
        if(y>n) break;
        dfs(x+1,y,z*(i+1),i);
        y*=prime[x];
    }
}
int main()
{
    while(scanf("%lld",&n)!=EOF)
    {
        res=fac=0;
        dfs(0,1,1,INF);
        cout<<res<<endl;
    }
    return 0;
}

 

posted @ 2015-06-25 14:09  哈特13  阅读(252)  评论(0编辑  收藏  举报