我直接给你 LeetCode 793. Preimage Size of Factorial Zeroes Function 的 Java 标准 AC 代码 + 极简思路,一步到位。

题目大意

函数  f(x)  是  x!  末尾 0 的个数。
给定  k ,问有多少个  x  满足  f(x) = k 。
答案只会是 0 或 5。

思路

1. 末尾 0 的个数 = 质因子 5 的个数(远多于 2)
2. 写一个函数  count(x)  计算  x!  有多少个 0
3. 二分找 最小的 x 使得 count(x) == k
4. 再找 最小的 x 使得 count(x) == k+1
5. 两个 x 之差就是答案(一定是 0 或 5)

Java AC 代码

java

class Solution {
public int preimageSizeFZF(int k) {
long left = findK(k);
long right = findK(k + 1);
return (int) (right - left);
}

// 找最小的 x 使得 count(x) >= t
private long findK(int t) {
    long l = 0, r = (long) 1e18;
    while (l < r) {
        long mid = l + (r - l) / 2;
        if (count(mid) >= t) {
            r = mid;
        } else {
            l = mid + 1;
        }
    }
    return l;
}

// 计算 x! 末尾 0 的个数
private long count(long x) {
    long res = 0;
    while (x > 0) {
        x /= 5;
        res += x;
    }
    return res;
}

}

关键点

  • count(x)  是严格不减函数
  • 每 5 个数一组,0 的个数要么不变,要么**+1**
  • 所以满足  f(x)=k  的 x 要么 0 个,要么 5 个

如果你愿意,我可以再给你:

  • 逐行注释版
  • 手算模拟过程
  • C++ / Python 版本

你要哪个?

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐