ZOJ 2562 More Divisors

又是个水题,刚刚开始没有用搜索,因为对于反素数有:

n=2^t1*3^t2^5^t3*7^t4..... 这里有 t1>=t2>=t3>=t4。

而且相同的因数的情况下,素数越不同越好。

哪知道这个方法错了! = =。

看来还得中规中矩得用dfs。

我觉得还可以优化下,感觉搜索干了很多无用的活儿。

搜索还得好好练练啊...

 1 #include<cstdio>
 2 #define LL long long
 3 using namespace std;
 4 int prim[16] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 };
 5 LL n,bestnum,bestsum;
 6 void dfs(LL num,LL sum,LL k,LL limit)
 7 {
 8     if(num>bestnum)
 9     {
10         bestnum=num;
11         bestsum=sum;
12     }
13     if(num==bestnum&&bestsum>sum)
14         bestsum=sum;
15     if(k>14) return;
16     for(int i=1;i<=limit;i++)
17     {
18         if(sum*prim[k]>n) break;
19         sum*=prim[k];
20         dfs(num*(i+1),sum,k+1,i);
21     }
22 }
23 int main()
24 {
25     while(scanf("%lld",&n)!=EOF)
26     {
27         bestnum=0,bestsum=n;
28         dfs(1,1,0,50);
29         printf("%lld\n",bestsum);
30     }
31     return 0;
32 }
View Code

 

转载于:https://www.cnblogs.com/yours1103/p/3281421.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值