C ++中阶乘零函数的原像大小

假设我们有一个函数f(x),它将在x的阶乘末尾返回零个数。因此对于f(3)= 0是因为3!= 6末尾没有零,而f(11)= 2是因为11!= 39916800在结尾处有2个零。现在,当我们有K时,我们必须找出有多少个非负整数x具有f(x)= K的性质。

因此,如果输入类似于K = 2,则答案将为5。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数ok(),这将需要x,

  • ret:= 0

  • 对于初始化i:= 5,当i <= x时,更新i:= i * 5,做-

    • ret:= ret + x / i

  • 返回ret

  • 从主要方法中,执行以下操作-

  • 如果K等于0,则-

    • 返回5

  • 低:= 1,高:= K * 5

  • 当低<高时,执行-

    • 高:=中

    • 低:=中+ 1

    • 中:=低+(高-低)/ 2

    • x:= ok(中)

    • 如果x <K,则-

    • 除此以外

    • 返回(如果ok(low)与K相同,则为5,否则为0)

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       lli ok(lli x){
          int ret = 0;
          for(lli i = 5; i <= x; i *= 5){
             ret += x / i;
          }
          return ret;
       }
       int preimageSizeFZF(int K) {
          if(K == 0) return 5;
          lli low = 1;
          lli high = (lli)K * 5;
          while(low < high){
             lli mid = low + (high - low) / 2;
             lli x = ok(mid);
             if(x < K){
                low = mid + 1;
             }else high = mid;
          }
          return ok(low) == K ? 5 : 0;
       }
    };
    main(){
       Solution ob;
       cout << (ob.preimageSizeFZF(2));
    }

    输入值

    2

    输出结果

    5