很重要的需要看出来的结论:
- 每个数分解后包含的不同质数个数最多10个 因为最小的11个质数相乘大于2e9了
- 每个质数的次数不超过30 因为 2 30 2^{30} 230超过了2e9
- 质数的指数一定随着底数的增大而减小(否则一定存在g(i)=g(x)且i<x,则x不是anti-prime)
以此为准进行搜索 非常快速
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n;
int a[15]={0,2,3,5,7,11,13,17,19,23,29};
int maxx;
long long res;
void dfs(int x,long long y,int num,int lt)
{
if(num>maxx||num==maxx&&y<res)maxx=num,res=y;
if(x==11)return;
long long k=1;
for(int i=0;i<=lt;++i)
{
if(y*k>n)break;
dfs(x+1,y*k,num*(i+1),i);
k*=a[x];
}
}
int main()
{
scanf("%lld",&n);
dfs(1,1ll,1,30);
printf("%lld\n",res);
return 0;
}