vjudge Trailing Zeroes (III) (二分答案 && 数论)

嗯...

 

题目链接:https://vjudge.net/contest/318956#problem/E

 

这道题是二分答案+数论,但首先是数论,否则你不知如何二分...

 

首先关于一个阶乘的结果最后会出现0(即10),肯定是由2 * 5所造成的,而对于正整数 N,在[0, N]范围内,质因子中含有 2 的总是会比质因子含有 5 的要多。所以,只要需要知道质因数含有 5 的数字有多少个,即可知道末尾连续出现 0 的个数有多少...

 

然后我们进行二分答案,从1~5e8 + 5(一定要足够大!)进行二分,如果当前答案处理出来的5的个数正好等于a,那么它可能是答案,因为可能我们把较小的遗漏了,所以我们要继续二分,如果有比它小的,继续更新...

 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 
 4 using namespace std;
 5 
 6 inline int check(int x){
 7     int ans = 0;
 8     while(x){
 9         ans += x / 5;
10         x /= 5;
11     }
12     return ans;
13 }//处理5的个数,即末尾0的个数 
14 
15 int main(){
16     int t, m = 0;
17     scanf("%d", &t);
18     while(t--){
19         int ans = 0, a;
20         m++;
21         scanf("%d", &a);
22         int l = 1, r = 5e8 + 5;
23         while(l <= r){
24             int mid = (l + r) >> 1;
25             int _mid = check(mid);
26             if(_mid > a) r = mid - 1;
27             else if(_mid < a) l = mid + 1;
28             else if(_mid == a) {ans = mid; r = mid - 1;}//可能有答案遗漏 
29         }
30         if(ans) printf("Case %d: %d\n", m, ans);
31         else printf("Case %d: impossible\n", m);
32     }
33     return 0;
34 }
AC代码

 

转载于:https://www.cnblogs.com/New-ljx/p/11343051.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值