zoj2562 反素数

/*

这题1 <= n <= 1016,暴力肯定是TLM,所以看了大牛求解小于N的反素数的算法,思路大致是这样的:

性质1:一个反素数的质因子一定是从2开始的若干个连续质数.

            因此可以枚举素因子,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47。。最多也就这么几个。

性质2:若有p=2^a1*3^a2*5^a3*......,则必有a1>=a2>=a3>=............an.

另外,如何求p的正约数个数呢,答案就是(a1+1)*(a2+1)*(a3+1)*..........(an=1)

如:p=6=2^1*3^1,故6的约束个数为(1+1)*(1+1)=4 ......等等

然后就是按照素因子递增的顺序逐个搜索,然后枚举每个质因子的个数

*/

#include<stdio.h>
typedef long long LL;
LL N;
LL BestSum;
LL BestRes;
LL prime[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};

void work(LL res,LL sum,LL k,LL limit)
{
 if(res>N)
  return;
 if(BestSum<sum)
 {
  BestSum=sum;BestRes=res;
 }
 else if(BestSum==sum&&BestRes>res)
  BestRes=res;
 if(k>=16)
  return;
 LL p=prime[k];
 int i;
 for(i=1;i<limit;i++,p*=prime[k])
 {
  if(res*p>N)
   break;
  work(res*p,sum*(i+1),k+1,i+1);
 }
}

int main()
{
 while(~scanf("%lld",&N))
 {
  BestSum=1;
  BestRes=1;
  work(1,1,0,50);
  printf("%lld\n",BestRes);
 }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值