反素数的定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0小于i小于x),都有g(i)小于g(x),则称x为反素数·
分解质因数,设一个数可以由p1^x1*p2^x2*p3^x3…组成
其中pi为质数,xi为该质数在一个数中出现的次数
满足反素数有以下条件:
1.因子必须是连续的质因子
2.质因子的次数必须满足后一个比前一个的大
然后因数个数就是(x1+1)(x2+1)(x3+1)…
那么对于1~n,我们就要找因数个数尽量多的
搜索枚举质因数个数,然后记录答案输出即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
LL n,ans,s[1100],last;
int tot,prime[105];
bool vis[105];
void dfs(int x,int num,LL mul)
{
if(x>12) return;
if(num>last || (num==last && mul<ans))
{
ans=mul;
last=num;
}
s[x]=0;
while(mul*prime[x]<=n && s[x]<s[x-1])
{
mul*=prime[x];
s[x]++;
dfs(x+1,num*(s[x]+1),mul);
}
}
int main()
{
scanf("%lld",&n);
for(int i=2;i<=50;i++)
{
if(!vis[i]) prime[++tot]=i;
for(int j=1;j<=tot && i*prime[j]<=50;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
s[0]=0x3f3f3f3f;
dfs(1,1,1);
printf("%lld",ans);
return 0;
}