定義:對於任何正整數,其約數的個數記爲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&&num15)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);
}