//经典题,反素数
定义
对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.
性质
性质一:一个反素数的质因子必然是从2开始连续的质数.
性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....
搞不懂的是为什么typedef long long 会比 每个long long 快 ,之前一直超时。
//num:当前枚举到的数,k:枚举到的第k大的质因子;sum:该数的约数个数;limit:质因子个数上限;
//l因为性质二 所以可以用limit优化
#include<cstdio>
typedef long long ll;
ll maxsum,bestnum,n;
const int prime[16]={1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
void dfs(ll num,ll sum, int k, int limit)
{
int i;
if(sum>maxsum)
{
bestnum=num;
maxsum=sum;
}
if(maxsum==sum&&num<bestnum)
{
bestnum=num;
}
if(k>15) return;
ll temp=num;
for( i=1; i<=limit; i++)
{
if(temp*prime[k]>n) break;
temp=temp*prime[k];
dfs(temp,sum*(i+1),k+1,i);
}
}
int main()
{
while(scanf("%lld",&n)!=EOF)
{
bestnum=1;
maxsum=0;
dfs(1,1,1,50);
printf("%lld\n",bestnum);
}
return 0;
}