Preimage Size of Factorial Zeroes Function

2581 단어 LeetCode
Let  f(x)  be the number of zeroes at the end of  x! . (Recall that  x! = 1 * 2 * 3 * ... * x , and by convention,  0! = 1 .)
For example,  f(3) = 0  because 3! = 6 has no zeroes at the end, while  f(11) = 2  because 11! = 39916800 has 2 zeroes at the end. Given  K , find how many non-negative integers  x  have the property that  f(x) = K .
Example 1:
Input: K = 0
Output: 5
Explanation: 0!, 1!, 2!, 3!, and 4! end with K = 0 zeroes.

Example 2:
Input: K = 5
Output: 0
Explanation: There is no x such that x! ends in K = 5 zeroes.

Note:
  • K  will be an integer in the range  [0, 10^9] .

  • 제목 설명: 정수 x에 대한 함수 f(x)를 설정하고 x를 되돌려줍니다!끝 0의 개수, K를 정하고 f(x)=K의 x가 몇 개인지 물어보기
    생각:
    우선 우리는 x를 구성해야 한다고 생각했다.마지막 0은 인자에 2와 5가 포함되거나 인자의 인자에 2와 5가 포함되어야 하기 때문에 f(x)를 계산하려면 1~x의 인자에 포함된 2와 5의 개수만 계산해야 한다.더욱이 x가 적어도 5를 증가시켜야 인자 5의 개수를 증가시킬 수 있다. x가 주로 2를 증가하면 인자 2의 개수를 증가시킬 수 있기 때문에 임의의 x에 대해 1~x의 인자 5의 개수는 반드시 인자 2의 개수보다 크기 때문에 1~x의 인자 5의 개수는 x이다!끝 0의 개수;다시 생각해 보면 5개의 수가 없으면 반드시 적어도 1대2와 5가 나타나기 때문에 임의의 K에 대해 구하는 해는 0이든 5든 x가 f(x)=K를 만든다면 가능한 x의 개수는 5이다.
    그리고 x가 f(x)=K를 만드는지 검증하는 방법을 고려해야 한다. 따라서 우리는 이런 x를 찾아서 f(x)=K를 만드는데 이분법을 사용하는 것을 고려해야 한다. 여기서 리코드의 용례가 비교적 크기 때문에 이분의 상한선을 크게 설정해야 한다.
    그리고 우리가 생각해야 할 것은 1~x중인자5의 개수를 어떻게 계산하는가이다. 5개의 수마다 하나의 인자5를 증가시키고 25개의 수마다 하나의 인자5를 추가하며 625개의 수마다 5개를 추가한다. 따라서 1~x중인자5의 개수는 x와 5의 멱을 합쳐서 얻을 수 있다.
           
    class Solution {
        public int preimageSizeFZF(int K) {
            if(min(K))
            	return 5;
            return 0;
        }
        
        public boolean min(int n){
        	long left = 0, right = Integer.MAX_VALUE;
        	right *= 100000;
        	while(left < right){
        		long mid = left + (right - left) / 2;
        		long count = 0;
        		long base = 5;
        		//System.out.println(mid);
        		while(base <= mid){
        			count += mid / base;
        			base *= 5;
        		}
        		if(count == n){
        			//System.out.println(mid + "!!");
        			return true;
        		}
        		if(count < n)
        			left = mid + 1;
        		else
        			right = mid - 1;
        	}
        	//System.out.println(left);
        	return false;
        }
    }

    좋은 웹페이지 즐겨찾기