bzoj 1053

题目其实就是求N范围内约数最多的数中最小的数。

若x=p1^k1*p2^k2……那么约数的个数就是(k1+1)*(k2+1)……的结果。

假如一个数分解质因数之后是一堆质数的一次方,那么我们肯定选素数小的才有可能是反素数。

所以别的素数就不用管了,前面十个素数的乘积就已经大于2*10^9了。

于是就dfs枚举每一个质数的个数即可。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int pri[]={2,3,5,7,11,13,17,19,23,29};
ll n,ans,val;
void dfs(int o,ll num,ll y){
    if(o==10) return;
    if(val<y) val=y,ans=num;
    if(val==y) ans=min(num,ans);
    for(int i=0;num<=n;num*=pri[o],i+=1)
        dfs(o+1,num,y*(i+1));
}
int main(){
    scanf("%lld",&n);
    dfs(0,1,1);
    printf("%lld",ans);
    return 0;
}

 

posted @ 2017-10-23 07:20  或是七一  阅读(94)  评论(0编辑  收藏  举报