题目大意:x的约数个数记为g(x),如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数,求出不超过n的最大的反质数
题解:x是反质数->x的因子多->x的质因子多,由一个数的因子个数计算式,取小质因子更优,然后大力搜,可以玄学剪枝一下
我的收获:质因子神啊,复杂度强啊
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x7fffffff
#define ll long long
int n,ans=1,num=1;
int p[]={1,2,3,5,7,11,13,17,19,23,29,31};
void dfs(int x,ll now,int cnt,int last)
{
if(x==12) return;
if(cnt>num||(cnt==num&&now<ans)) ans=now,num=cnt;//选因数多的……
for(int t=1,i=0;i<=last&&now*t<=n;i++,t*=p[x])
dfs(x+1,now*t,cnt*(i+1),i);
}
void init()
{
scanf("%d",&n);
dfs(1,1,1,20);
printf("%d\n",ans);
}
int main()
{
init();
return 0;
}