Easy

题目描述

给你一个正整数 n,它最初被放在板上。每一天,在连续 10^9 天内,你都要执行以下过程:

  • 对于板上存在的每个数字 x,找到所有满足 1 <= i <= nx % i == 1 的数字 i
  • 然后,将这些数字放在板上。

返回在 10^9 天过去后,板上存在的不同整数的数量。

注意:

  • 一旦数字被放在板上,它将一直保留到最后。
  • % 表示取模运算。例如,14 % 3 等于 2

示例 1:

输入:n = 5
输出:4
解释:最初,5 在板上。
第二天,2 和 4 将被添加,因为 5 % 2 == 1 和 5 % 4 == 1。
在那天之后,3 将被添加到板上,因为 4 % 3 == 1。
在十亿天结束时,板上的不同数字将是 2、3、4 和 5。

示例 2:

输入:n = 3
输出:2
解释:
因为 3 % 2 == 1,所以 2 将被添加到板上。
十亿天后,板上只有两个不同的数字 2 和 3。

约束条件:

  • 1 <= n <= 100

提示:

  • 对于 n > 2n % (n - 1) == 1,因此 n - 1 将在第二天被添加到板上。
  • 由于操作进行了很长时间,所有小于 n 的数字(除了 1)都会被添加到板上。
  • 如果 n == 1 会发生什么?

解题思路

这道题的关键在于观察数学规律。我们需要分析当 x % i == 1 时,哪些数字会被添加到板上。

核心观察:

  1. x % i == 1 时,意味着 x = k*i + 1,其中 k 是正整数
  2. 对于任何数字 x > 1,都有 x % (x-1) == 1,因为 x = 1*(x-1) + 1
  3. 这意味着如果板上有数字 x,那么 x-1 也会被添加到板上(除非 x-1 = 1

模拟过程分析:

  • n 开始,n % (n-1) == 1,所以 n-1 会被添加
  • 然后 (n-1) % (n-2) == 1,所以 n-2 会被添加
  • 这个过程会一直持续到 2

特殊情况:

  • n = 1 时,没有满足条件的 i(因为要求 1 <= i <= ni 要使得 1 % i == 1,但 1 % 1 = 0
  • n > 1 时,最终板上会有从 2 到 n 的所有整数

因此答案很简单:

  • 如果 n = 1,返回 1
  • 如果 n > 1,返回 n - 1

这是因为经过足够长时间后,除了 1 以外的所有小于等于 n 的数字都会出现在板上。

代码实现

class Solution {
public:
    int distinctIntegers(int n) {
        return n == 1 ? 1 : n - 1;
    }
};
class Solution:
    def distinctIntegers(self, n: int) -> int:
        return 1 if n == 1 else n - 1
public class Solution {
    public int DistinctIntegers(int n) {
        return n == 1 ? 1 : n - 1;
    }
}
var distinctIntegers = function(n) {
    if (n === 1) return 1;
    return n - 1;
};

复杂度分析

复杂度类型复杂度
时间复杂度O(1)
空间复杂度O(1)

相关题目