1053: [HAOI2007]反素数ant
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 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);
}