[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<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数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<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值