题目描述
对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。
如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。
现在给定一个数N,你能求出不超过N的最大的反质数么?
输入格式
一个数N(1<=N<=2,000,000,000)。
输出格式
不超过N的最大的反质数。
输入输出样例
输入 #1
1000
输出 #1
840
解释:发现其素数个数必然递减,0个数也算上。这样的话从2开始只需要12个素数就可以,我们可以在上面进行搜索,利用这个性质就行搜索就OK
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p[]={0,2,3,5,7,11,13,17,19,23,29,31,37};
ll num[20]={1},t_mi[20]={1},mi[20]={666},n,ansx,ansy;
void dfs(int x){
for(mi[x]=1,num[x]=num[x-1]*p[x],t_mi[x]=t_mi[x-1]<<1;mi[x]<=mi[x-1]&&num[x]<=n;mi[x]++,t_mi[x]+=t_mi[x-1],num[x]*=p[x]){
if(ansx<t_mi[x]){
ansx=t_mi[x];
ansy=num[x];
}
else if(ansx==t_mi[x]) ansy=min(ansy,num[x]);
dfs(x+1);
}
}
int main(){
scanf("%lld",&n);
ansx=1;//个数
ansy=1;//值
dfs(1);
printf("%lld\n",ansy);
return 0;
}