题目:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2562题意:
求小于等于n的约数最多的数。就是求反素数。思路:
枚举小质因子搜索找反素数。
反素数约数必然是res=2^a+3^b+5^c+7^d……;
枚举质因子个数,约数个数就是所有质因子的组合。
代码:
#define N 112
long long n,m;
long long flag,sum,ave,ans,res,len,ans1,ans2;
bool mark[N];
int pri[N],cnt;
void SP()
{
cnt=0;
memset(mark,true,sizeof(mark));
mark[0]=mark[1]=false;
for(int i=2;i<=N;i++)
if(mark[i])
{
pri[cnt++] = i;
for(int j=2;j*i<N;j++)
mark[j*i]=false;
}
}
void solve(long long now,long long num,long long k)
{
if(num>sum)sum=num,res=now;
if(num==sum&&res>now)sum=num,res=now;
if(k>20)return;
for(int i=1;i<50;i++)
{
if(now*pri[k]<=n)
now*=pri[k];
else
break;
solve(now,num*(i+1),k+1);
}
}
int main()
{
int i,j,k,kk,t,x,y,z;
while(scanf("%lld",&n)!=EOF&&n)
{
sum=0;res=n;
solve(1,1,0);
printf("%lld\n",res);
}
return 0;
}