http://acm.sgu.ru/problem.php?contest=0&problem=154


给出数Q,求出最小的自然数N使得N!的末尾恰有Q个0,无解输出"No solution"

对于一个数n,求出它的末尾有几个0,只需看n之内的数的质因子5的个数,因为2的个数远多于5。所以可知道一个数末尾0的个数
Q = n/5 + n/(5^2) + n/(5^3) + ...
而题目给出的是Q,要求出的是N,由于是要求出最小的自然数,所以N必定是5的倍数,这点不多做解释。
根据等比数列的求和公式,有
Q = N(5^k - 1) / [4*(5^k)],由此得
N = 4Q * [(5^k)/(5^k-1)]
注意到 1 < (5^k)/(5^k-1) <= 5/4,且当k->无穷时,(5^k)/(5^k-1)->1,所以可先算出N=4Q的末尾零的个数与所给的Q比较,显然所求的数就在4Q的附近,所以不需要二分查找。
不知道题目的自然数包不包括0,所以提交前先去论坛看了一下,发现0不算入自然数,所以修改了下程序判断0的情况。

#include <stdio.h>

int ZeroTrail(int n);

int main(void{
    
int q;
    scanf (
"%d"&q);
    
if (!q) {
        printf (
"1\n");
        
return 0;
    }

    
int i = 4*q/5*5;
    
while (ZeroTrail(i) < q) {
        i 
+= 5;
    }

    
if (q == ZeroTrail(i)) {
        printf (
"%d\n", i);
    }
 else {
        printf (
"No solution\n");
    }

    
return 0;
}


int ZeroTrail(int n) {
    
int count = 0;
    
while (n) {
       count 
+= n/5;
       n 
/= 5;
    }

    
return count;
}

posted on 2010-05-03 15:03 Willing 阅读(385) 评论(0)  编辑 收藏 引用 所属分类: ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理