Jackiesteed

www.github.com/jackiesteed

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.

如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

现在给一个N,求出不超过N的最大的反素数.

性质一:一个反素数的质因子必然是从2开始连续的质数.

因为最多只需要若干个素数构造:2,3,5,7,11,13,17,19,23,29,31,...

性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

附代码:

zoj-2562

View Code
#include <iostream>
#include
<fstream>
#include
<cstring>
#include
<cmath>

using namespace std;

long long prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};

long long bestSum;
long long bestRes;
long long N;
void work(long long res,long long sum,int k,long long limit)
{
if(res>N)
return;
if(sum>bestSum)
{
bestSum
=sum;
bestRes
=res;
}
else if(sum==bestSum && res<bestRes)
{
bestRes
=res;
}
if(k>=16)
return;

long long p=prime[k];
for(long long i=1;i<=limit;i++,p*=prime[k])
{
if(res*p>N)
break;
work(res
*p,sum*(i+1),k+1,i);
}
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%lld",&N)!=EOF)
{
bestSum
=1LL;
bestRes
=1LL;
work(1LL,1LL,
0,50LL);
printf(
"%lld\n",bestRes);
}
return 0;
}

posted on 2011-04-17 14:30  Jackiesteed  阅读(582)  评论(0编辑  收藏  举报