题解:

其实就是求1-n之中拥有最多约数的数

一个数x的质因数分解为p1^e1*p2^e2*...*pn^en,则正因数的个数为(e1+1)(e2+1)...(en+1)

那么发现,正因数的个数和p没有关系

那么p越小越好

于是,若x是最好的,且x=p1^e1*p2^e2*...*pn^en,则e1<e2<e3<..en,且p1=2,p2=3....

那么这个p就不会很大,所以枚举的范围就大大缩小了

代码:

#include<bits/stdc++.h> 
using namespace std;  
typedef long long LL;  
typedef pair<int,int> PII;  
const int MX=1e2+5;  
const int INF=0x3f3f3f3f;  
int ans;  
LL id,n,prime[MX],psz,vis[MX];  
void prime_init() 
{  
    vis[1]=1;  
    for(int i=2;i<MX;i++)
     {  
        if(vis[i])continue;  
        prime[++psz]=i;  
        for(int j=2*i;j<MX;j+=i)vis[j]=1;  
     }  
    psz=17;  
}  
void DFS(LL s,int cnt,int p,int bo) 
{  
    if(cnt>ans||(cnt==ans&&s<id))
     {  
        ans=cnt;
        id=s;  
     }  
    for(int i=1;i<=bo&&(double)s*prime[p]<=n;i++)
     {  
        s*=prime[p];  
        DFS(s,cnt*(i+1),p+1,i);  
     }  
}  
int main() 
{  
    prime_init();  
    scanf("%I64d",&n);  
    ans=id=1;  
    DFS(1,1,1,100);  
    printf("%d\n",id);   
}  

 

posted on 2017-10-04 19:59  宣毅鸣  阅读(107)  评论(0编辑  收藏  举报