假设我们有一个函数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