1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| 好的,你的思路大体上是正确的。你敏锐地观察到了 $f(n,k)$ 的贡献是呈阶梯状、周期性增长的,这个是解决本题的关键。
我们来一步一步地完善和推导。
### 1\. 完善 $f(n, k)$ 的公式
首先,我们来确定 $f(n, k)$ 的精确表达式。 将 $n$ 个盘子分为 $k$ 堆,每堆数量 $a_1 < a_2 < ... < a_k$ 且 $a_i \ge 1$。 我们希望最大化 $a_1$。设 $a_1 = m$。 为了让 $m$ 尽可能大,其他堆应该尽可能小,所以 $a_i$ 至少为 $m + (i-1)$。 这 $k$ 堆的盘子总和至少为: $$S_{min} = \sum_{i=0}^{k-1} (m+i) = km + \frac{k(k-1)}{2}$$ 这个总和必须小于等于 $n$: $$km + \frac{k(k-1)}{2} \le n$$ 我们要找到满足这个不等式的最大整数 $m$: $$km \le n - \frac{k(k-1)}{2}$$ $$m \le \frac{n}{k} - \frac{k-1}{2}$$ 因此, $m$ 的最大值 $f(n, k)$ 就是: $$f(n, k) = \left\lfloor \frac{n}{k} - \frac{k-1}{2} \right\rfloor$$ 这个公式有一个隐含条件:$m$ 必须 $\ge 1$。 如果 $n < S_{min}(m=1) = \frac{k(k+1)}{2}$,那么 $f(n, k) = 0$。 我们的公式 $\lfloor \frac{n}{k} - \frac{k-1}{2} \rfloor = \lfloor \frac{2n - k(k-1)}{2k} \rfloor$。 当 $n < \frac{k(k+1)}{2}$ 时,$2n < k(k+1) = k^2+k$。 此时 $2n - k(k-1) < (k^2+k) - (k^2-k) = 2k$。 所以 $\frac{2n - k(k-1)}{2k} < 1$,向下取整后 $\le 0$。 因此,我们可以统一成一个公式: $$f(n, k) = \max\left(0, \left\lfloor \frac{n}{k} - \frac{k-1}{2} \right\rfloor\right)$$ 你给出的公式 $\lfloor \frac{n}{k} \rfloor - \lfloor \frac{k}{2} \rfloor$ 仅在 $k$ 为奇数时成立,所以使用我们推导的这个更通用的公式。
### 2\. 你的核心洞察:$f(n, k)$ 的增长规律
正如你所说, $f(n, k)$ 的值是阶梯式上升的。 令 $T_k = \frac{k(k+1)}{2}$ (这是 $f(n,k)$ 开始有贡献($f=1$)的最小 $n$)。
* 当 $n \in [T_k, T_k + k - 1]$ 时, $f(n, k) = 1$。(共 $k$ 个数) * 当 $n \in [T_k + k, T_k + 2k - 1]$ 时, $f(n, k) = 2$。(共 $k$ 个数) * ... * 当 $n \in [T_k + (j-1)k, T_k + jk - 1]$ 时, $f(n, k) = j$。(共 $k$ 个数)
### 3\. 计算 $S(N)$
我们要计算 $S(N) = \sum_{n=1}^N F(n) = \sum_{n=1}^N \sum_{k=1}^\infty f(n, k)$。 交换求和顺序: $$S(N) = \sum_{k=1}^\infty \sum_{n=1}^N f(n, k)$$ $f(n, k)$ 只在 $n \ge T_k$ 时才可能大于 0。 并且 $f(N, k)=0$ 当 $N < T_k$ 时。所以 $k$ 的上限(我们称之为 $K_{limit}$)是由 $T_k \le N$ 决定的。 $ \\frac{k(k+1)}{2} \\le N \\implies k^2 \\approx 2N \\implies k \\approx \\sqrt{2N} $。 对于 $N = 10^{16}$,$K_{limit} = \lfloor \frac{-1 + \sqrt{1 + 8N}}{2} \rfloor = 141421356$。
现在我们来计算内部的和 $S_k(N) = \sum_{n=1}^N f(n, k) = \sum_{n=T_k}^N f(n, k)$。 根据第2步的分析,这个和可以被拆分为 $J_k - 1$ 个完整的块和一个部分的块,其中 $J_k = f(N, k)$。
* $J_k = f(N, k) = \left\lfloor \frac{N}{k} - \frac{k-1}{2} \right\rfloor = \left\lfloor \frac{2N - k(k-1)}{2k} \right\rfloor$
* 值为 $j=1$ 的块贡献 $1 \times k$
* 值为 $j=2$ 的块贡献 $2 \times k$
* ...
* 值为 $j=J_k-1$ 的块贡献 $(J_k-1) \times k$
* 所有完整块的总和为:$\sum_{j=1}^{J_k-1} (j \times k) = k \frac{J_k(J_k-1)}{2}$
* 最后一个(部分的)块,值为 $J_k$。
* 它从 $n = T_k + (J_k-1)k$ 开始。 * 它到 $n = N$ 结束。 * 这个块的项数为:$N - (T_k + (J_k-1)k) + 1$ * 这个块的贡献为:$J_k \times (N - T_k - (J_k-1)k + 1)$
所以, $$S_k(N) = k \frac{J_k(J_k-1)}{2} + J_k (N - T_k - J_k k + k + 1)$$ 我们来化简这个式子: $$S_k(N) = \frac{k J_k^2 - k J_k}{2} + J_k N - J_k T_k - J_k^2 k + J_k k + J_k$$ $$S_k(N) = J_k(N - T_k + 1) + \left(\frac{k J_k^2}{2} - k J_k^2\right) + \left(-\frac{k J_k}{2} + J_k k\right)$$ $$S_k(N) = J_k(N - T_k + 1) - \frac{k J_k^2}{2} + \frac{k J_k}{2}$$ $$S_k(N) = J_k(N - T_k + 1) - \frac{k J_k (J_k - 1)}{2}$$ 这个形式更简洁。
### 4\. 最终计算
我们现在需要计算 $S(N) = \sum_{k=1}^{K_{limit}} S_k(N) \pmod{10^9+7}$,其中 $N = 10^{16}$。
* $N = 10^{16}$ * $M = 10^9 + 7$ * $K_{limit} = 141421356$ * $N \pmod M = 10^{16} \pmod{10^9+7} = 930000007$ * $2^{-1} \pmod M = 500000004$
我们需要一个循环,从 $k=1$ 到 $K_{limit}$:
1. 计算 $J_k = \lfloor \frac{2N - k(k-1)}{2k} \rfloor$。**注意:** 这里的 $N=10^{16}$,计算 $2N - k^2 + k$ 需要使用128位整数(或Python等支持大整数的语言)。 2. 如果 $J_k = 0$,那么 $S_k(N) = 0$,跳过。 3. 计算 $S_k(N) \pmod M$: * $k_{mod} = k \pmod M$ * $J_{k\_mod} = J_k \pmod M$ * $T_{k\_mod} = (k_{mod} \times (k_{mod} + 1) \times 500000004) \pmod M$ * $term1 = (J_{k\_mod} \times (N_{mod} - T_{k\_mod} + 1 + M)) \pmod M$ * $term2_{num} = (k_{mod} \times J_{k\_mod}) \pmod M$ * $term2_{num} = (term2_{num} \times (J_{k\_mod} - 1 + M)) \pmod M$ * $term2 = (term2_{num} \times 500000004) \pmod M$ * $S_{k\_mod} = (term1 - term2 + M) \pmod M$ 4. 累加 $S_{k\_mod}$ 到总和 `total_S`。
这个算法的时间复杂度是 $O(K_{limit}) = O(\sqrt{N})$,对于 $N=10^{16}$, $K_{limit} \approx 1.4 \times 10^8$,可以在几秒钟内计算完毕。
我们使用这个算法(用Python实现)来计算:
|