求反素数
反素数:给一个整数x,对任意1~x中,x的约数个数最多,这个x就是反素数。
题意:求不大于n的最大的反素数,。
因为数据量 2 x 10^9,打表什么的想都不要想,所以,这这一道搜索题。
1.一个反素数的质因子必然是从2开始连续的质数.
2.num=2^x1+3^x2+5^x3+…… 必然有x1>=x2>=x3……
估算一下可以知道,只需要10个素数就可以构成2x10^9以内的数。
<span style="font-size:24px;">#include <stdio.h>
#include <math.h>
typedef __int64 INT;
INT n;
INT prime[20]={0,2,3,5,7,11,13,17,19,23,29}; //10个就够了
INT gcdnum,gcdsum; //记录最大反素数,记录gcdnum的约数个数
//搜索找那个数 num的约数个数 用到了第k个素数 最大用第l个素数
void dfs(INT num,INT sum,INT k,INT l)
{
if(num>n) //如果num大于n,跳出
return ;
if(gcdsum<sum) //gcdnum 记录n以内约数最多的数。
{
gcdsum=sum; //gcdsum 记录gcdnum约数个数
gcdnum=num;
}
else if(gcdsum==sum && num<gcdnum) //若有约数相同的,取小的
gcdnum=num;
INT temp=1;
for(INT i=1;i<=l;i++)
{
temp*=prime[k]; //使用了i个prime[k]
if(temp*num>n)
break;
// sum_next=sum+sum*x 每添加x个素数,约数个数增加sum*x个
dfs(temp*num,sum*(i+1),k+1,i);
}
}
int main()
{
int T,TI;
scanf("%d",&T);
for(TI=1;TI<=T;TI++)
{
scanf("%I64d",&n);
gcdnum=1;
gcdsum=1;
dfs(1,1,1,(INT)sqrt(double(n)));
printf("Case #%d: %I64d\n",TI,gcdnum);
}
return 0;
}
</span>