zoukankan      html  css  js  c++  java
  • Light oj 1138

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1138

    题目就是给你一个数表示N!结果后面的0的个数,然后让你求出最小的N。

    我们可以知道N!里5(包括5的倍数)的个数比2(包括2的倍数)的个数多,所以1对应5!,2对应10!... 而末尾0的个数与N成正比,1e8对应的N最大是400000015。我用二分查询N对应末尾0的个数,要是计算出来末尾0的个数比给你的数还大就L=mid+1,否则就R=mid。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 int get(int n) {
     7     int cont = 0;
     8     while(n / 5) {
     9         cont += n / 5;
    10         n /= 5;
    11     }
    12     return cont;
    13 }
    14 
    15 int main() 
    16 {
    17     int t , n;
    18     scanf("%d" , &t);
    19     for(int ca = 1 ; ca <= t ; ca++) {
    20         scanf("%d" , &n);
    21         int L = 5 , R = 400000015;
    22         while(L < R) {
    23             int mid = (L + R) / 2;
    24             if(n <= get(mid))  
    25                 R = mid;
    26             else
    27                 L = mid + 1;
    28         }
    29         printf("Case %d: " , ca);
    30         if(get(L) == n) {
    31             printf("%d
    " , L);
    32         }
    33         else {
    34             printf("impossible
    ");
    35         }
    36     }
    37 }
  • 相关阅读:
    异步非阻塞
    jdbc简单入门
    网络编程
    多线程
    java方法
    java之面向对象
    java-多线程
    Java之反射机制
    使用C#完成冒泡排序
    TextEdit不能空验证设置
  • 原文地址:https://www.cnblogs.com/Recoder/p/5334846.html
Copyright © 2011-2022 走看看