定义:对于任何正整数,其约数的个数记为g(x)。g(1)=1,g(6)=4。如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。
问题:求出不超过N的最大的反素数。
分析:即求[1..N]中约数最大的数。
若N=a1^b1*a2^b2*a3^b3......*an^bn;
则g(N)=(b1+1)*(b2+1)*(b3+1)*...*(bn+1);
所以可以根据质因数大小递增顺序搜索每一个质因子,枚举每一个质因子。
性质1:一个反素数的质因子必然是从2开始连续的质数。
性质2::p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=...
#include
typedef long long ll;
ll n;
ll bestnum,bestsum;
const int prime[16]= {1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
void getrprim(int num,int k,int sum,int limit)
{
if(sum>bestsum)
{
bestsum=sum;
bestnum=num;
}
if(sum==bestsum&&num
15)return;
ll tmp=num;
for(int i=1;i<=limit;i++)
{
if(tmp*prime[k]>n)break;
tmp*=prime[k];
getrprim(tmp,k+1,sum*(i+1),i);
}
}
ll log2(ll m)
{
int i=0;
ll res=1;
while(res<=n)
{
res*=2;
i++;
}
return i;
}
int main()
{
scanf("%lld",&n);
getrprim(1,1,1,log2(n));
printf("%d\n",bestnum);
}