BZOJ 1053: [HAOI2007]反素数ant

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 4175 Solved: 2493
[Submit][Status][Discuss]
Description

  对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。如果某个正整数x满足:g(x)>g(i) 0

解题思路

做这道题首先要知道一个结论,首先,x可以被分解成若干个素数的乘积,x的约数就是这些素数的指数+1的乘积,我们还要优先选取质数较小指数较大的,所以考虑dfs。每次在不超过n的前提下搜索,如果约数更多或now更小则更新答案。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL long long

using namespace std;

LL n;
int prime[15]={0,2,3,5,7,11,13,17,19,23,29,31,33};
int sum;
LL ans;

inline void dfs(int k,LL now,int cnt,int last){
    if(k==13){
        if(now<=ans && cnt>=sum) {sum=cnt;ans=now;}
        if(now>=ans && cnt>sum) {sum=cnt;ans=now;}
        return;
    }
    int t=1;
    for(register int i=0;i<=last;i++){
        dfs(k+1,now*t,cnt*(i+1),i);
        t*=prime[k];
        if(now*t>n) break;
    }
}

int main(){
    scanf("%lld",&n);
    dfs(1,1,1,20);
    printf("%lld",ans);
    return 0;
}
posted @ 2018-07-15 19:02  Monster_Qi  阅读(92)  评论(0编辑  收藏  举报