[bzoj1053]反质数

1053: [HAOI2007]反素数ant

Time Limit: 10 Sec   Memory Limit: 162 MB
Submit: 1713   Solved: 950
[ Submit][ Status]

Description

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0 现在给定一个数N,你能求出不超过N的最大的反质数么?

Input

一个数N(1<=N<=2,000,000,000)。

Output

不超过N的最大的反质数。

Sample Input

1000

Sample Output

840
 
  

        刚开始看这个题的时候没有思路,当再仔细读读反质数的定义时,发现了一些新的东西:①根据反质数的定义,我们可以很容易的明白,在一个因子数为n的集合中,这个集合中最小的数就是一个反质数。那么根据我们总结出的这个规律,我们可以知道,在给定的n中最大的反质数就是小于n的数中因子数最多的数中最小的数。

知道了算法之后怎样去实现呢??

        ②我们可以先保存10个质数,用分解质因数的方法来搜索求解。

/**************************************************************
    Problem: 1053
    User: _vampire_
    Language: C++
    Result: Accepted
    Time:32 ms
    Memory:1276 kb
****************************************************************/
 
#include
#include
#include
#include
using namespace std;
int su[10]={2,3,5,7,11,13,17,19,23,29},num=0;//num保存因子的个数 
long long ans,n;  //ans是输出结果 
inline void dfs(int x,int y,long long z){  //x,y,z,分别保存搜到质数的位置,因子个数和搜到的这个数的大小 
    int i;
    if(y>num){
        num=y;
        ans=2100000000;
    }
    if(y==num) ans=min(z,ans);
    if(x>=10) return ;
    for(i=0;z<=n;z*=su[x],++i){
        dfs(x+1,y*(i+1),z);
    }
}
int main()
{
    scanf("%lld",&n);
    dfs(0,1,1);
    printf("%lld",ans);
}


你可能感兴趣的:(数论,搜索)