zoukankan      html  css  js  c++  java
  • SGU 154.Factorial

    时间限制:0.25s

    空间限制:4M

    题意

             你的任务是找到最小自然数 N, 使N!在十进制下包含 Q个零. 众所周知 N! = 1*2*...*N. 例如, 5! = 120, 120 结尾包含1个零.

    Input

            一个数 Q (0<=Q<=10^8).

    Output

             如果无解,输出"No solution" , 否则输出 N .

    Sample test(s)

    Input

         2

    Output

        10

     

     

     

     


    Solution:

                 二分答案。

                 首先要知道如何求一个数的阶乘中一个因子的个数。

                 对于k!,其中至少包含一个p因子的数有,k/p个

                              两个p因子的有k/p^2  个,但其中的一个上一步中已经计算,所以只要加上k/p^2  即可

                              ....

                              后面的类推

                 那么只要二分答案就可以得出解

                时间复杂度O(log2N*log5N)

    #include <iostream>
    using namespace std;
    int  check (int x) {
    	int s = 0;
    	while(x){
                  s+=x/5;
                  x/=5;
    	}
    	return s;
    }
    int n;
    int main() {
    	cin >> n;
    	int l = 1, r = n *5, k, mid;
    	int last = -1;
    	if(n==0) last=1;
    	while (l <= r) {
    		mid = l + (r - l) / 2;
    		k = check (mid);
    		if (k == n) {
    			last = mid;
    			r = mid - 1;
    		}
    		else if (k > n) r = mid - 1;
    		else if (k < n) l = mid + 1;
    	}
    	if (last != -1 ) cout << last;
    	else
    		cout << "No solution";
    }
    

      

  • 相关阅读:
    20145231第九周学习笔记
    20145231第八周学习笔记
    20145231《Java程序设计》第三次实验报告
    20145231第七周学习笔记
    20145231《Java程序设计》第二次实验报告
    测试「20200912测试总结」
    题解「Luogu4774 [NOI2018]屠龙勇士」
    总结「斯坦纳树」
    题解「AT1226 電圧」
    题解「AT1983 [AGC001E] BBQ Hard」
  • 原文地址:https://www.cnblogs.com/keam37/p/3851815.html
Copyright © 2011-2022 走看看