对于任何正整数 x,其约数的个数记作 g(x),例如 g(1)=1、g(6)=4。
如果某个正整数 x 满足:对于任意的小于 x 的正整数 i,都有 g(x)>g(i),则称 x 为反素数。
例如,整数 1,2,4,6 等都是反素数。
现在给定一个数 N,请求出不超过 N 的最大的反素数。
输入格式
一个正整数 N。
输出格式
一个整数,表示不超过 N 的最大反素数。
数据范围
1≤N≤2∗109
输入样例:
1000
输出样例:
840
思路:这个题我们就是要求出[1-n]中约数最多的最小的那个数,首先我们要先知道一个公式
因为我们要求小的数所以t1<=t2<=t3<=…<=tk
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll maxx,num=2e9+101;
int s[9]={2,3,5,7,11,13,17,19,23},n;
void dfs(ll pos,ll last,ll p,ll g)
{
if(g>maxx||(g==maxx&&p<num))//当当前约数个数大于最大时更新或着相等并且当前数比之前求的小
{
num=p;
maxx=g;
}//printf("<<%lld %lld %lld %lld\n",pos,last,p,g);
if(pos==9) return;//当pos等于9时直接返回
for(int i=1;i<=last;i++)
{
if((ll)p*s[pos]>n) return;
p*=s[pos];
dfs(pos+1,i,p,g*(i+1));
}
}
int main()
{
scanf("%d",&n);
dfs(0,30,1,1);
printf("%lld",num);
}