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以内约数最多的最大正整数(显然是一个反质数,且所有在范围内的数均不为反质数,因为对于任意正整数都有且),然后由约数个数定律(设则的约数个数为),可得越小的质数对于更有利,所以枚举前12个质数即可,下面是程序:
#include<stdio.h>
#include<iostream>
#define ll long long
using namespace std;
const int p[30]={2,3,5,7,11,13,17,19,23,29,31,37};
int mx[30],use[30],ans,k;
ll n;
inline int log(const int x,ll &n){
ll s=1;
int ans=0;
while(s*x<=n){
s*=x;
ans++;
}
return ans;
}
void dfs(int x,ll now){
if(now>n){
return;
}
if(x==12){
int i,s=1;
for(i=0;i<12;i++){
s*=use[i]+1;
}
if(s>k||(s==k&&now<ans)){
ans=now;
k=s;
}
return;
}
int i,t=1;
for(i=0;i<=mx[x];i++){
use[x]=i;
dfs(x+1,now*t);
t*=p[x];
}
}
int main(){
int i;
scanf("%lld",&n);
for(i=0;i<12;i++){
mx[i]=log(p[i],n);
}
dfs(0,1);
printf("%d\n",ans);
return 0;
}