Hockey-Stick 恒等式 (Christmas Stocking Theorem)

Hockey-Stick 恒等式 (Christmas Stocking Theorem)

结论

\(\displaystyle \sum_{j = 0}^{k}\binom{i + j}{i} = \binom{i + k + 1}{i + 1}\).

证明

切入点 \(1\) : 组合意义

右侧的意义是从 \(i + k + 1\) 个不同元素中选择 \(i + 1\) 个的方案数.

\(ans = \binom{i + k + 1}{i + 1}\).

现在试图从右侧推到左侧.

考虑所有的不同元素从小到大排序, 下标为: \(1, 2, \dots, i + k + 1\). 现在考虑选完 \(i + 1\) 个之后, 限制选的最大值的下标为 \(mx\), 那么有 \(i + 1 \leqslant mx \leqslant i + k + 1\). 因为 \(mx\) 为实实在在选到的元素最大值下标, 所以在取值范围内的每一个 \(mx\) 算出的选择方案数和其余 \(mx\) 均不算重. 每个 \(mx\) 位置必选, 剩下的从 \(mx - 1\) 中选 \(i + 1 - 1\) 个. 所以有: \(ans = \sum_{mx = i + 1}^{i + k + 1}\binom{mx - 1}{i + 1 - 1}\).

\(m' = mx - 1\), 有: \(ans = \sum_{m' = i}^{i + k}\binom{m'}{i}\).

\(m' = i + j\), 有: \(ans = \sum_{j = 0}^{k}\binom{i + j}{i}\).

所以得证: \(\sum_{j = 0}^{k}\binom{i + j}{i} = \binom{i + k + 1}{i + 1}\).

切入点 \(2\) : 数学归纳法

基础边界情况

  • \(k = 0\) 时:

    • 左边: \(\sum_{j=0}^{0} \binom{i+j}{i} = \binom{i+0}{i} = \binom{i}{i} = 1\).
    • 右边: \(\binom{i+0+1}{i+1} = \binom{i+1}{i+1} = 1\).
    • 成立.
  • \(i = 0\) 时:

    • 左边: \(\sum_{j=0}^{k} \binom{0+j}{0} = \sum_{j=0}^{k} \binom{j}{0} = \sum_{j=0}^{k} 1 = k + 1\).
    • 右边: \(\binom{0+k+1}{0+1} = \binom{k+1}{1} = k + 1\).
    • 成立.

引理证明: 组合数递推公式

结论

\(\displaystyle \binom{n}{k} = \binom{n - 1}{k - 1} + \binom{n - 1}{k}\).

理解与证明

\(n\) 个不同元素中选 \(k\) 个, 有两种选择情况:

  1. 最后一个元素不选, 在剩余的 \(n - 1\) 个元素中选择 \(k\) 个.
  2. 最后一个元素选择, 在剩余的 \(n - 1\) 个元素中选择 \(k - 1\) 个.

两种情况通过加法原理相加, 得到最终答案.

数学归纳法证明

假设 \(\sum_{j = 0}^{k}\binom{i + j}{i} = \binom{i + k + 1}{i + 1}\) 成立, 那么只需证明对 \(k + 1\) 的情况成立, 即可推广至对 \(k \geqslant 0\) 全部成立.

现求证: \(\sum_{j = 0}^{k + 1}\binom{i + j}{i} = \binom{i + (k + 1) + 1}{i + 1}\).

左侧可转化为: \(\sum_{j = 0}^{k}\binom{i + j}{i} + \binom{i + (k + 1)}{i}\).

右侧逆用引理组合数递推公式, 可得 \(\binom{i + k + 2}{i + 1} = \binom{i + k + 1}{i} + \binom{i + k + 1}{i + 1}\).

又因为, 我们假设 \(\sum_{j = 0}^{k}\binom{i + j}{i} = \binom{i + k + 1}{i + 1}\) 成立, 所以右侧可转化为: \(\binom{i + k + 1}{i} + \binom{i + k + 1}{i + 1} = \binom{i + k + 1}{i} + \sum_{j = 0}^{k}\binom{i + j}{i}\).

现在发现, 左侧右侧转化之后相等. 可证明假设 \(k\) 成立的情况下, \(k + 1\) 也成立, 那么从 \(k = 0\) 的成立递推归纳, 可证得, 对于 \(k \geqslant 0\), \(\sum_{j = 0}^{k}\binom{i + j}{i} = \binom{i + k + 1}{i + 1}\) 成立.

算法应用与 \(Code\) 写法

例题

Problem - 1696E - Codeforces

思路解析

因为初始在 \((0, 0)\)\(1\) 个玩偶, 每次向 \((i + 1, j)\)\((i, j + 1)\) 分裂成 \(2\) 个, 所以在 \((i, j)\) 统计的玩偶数相当于从 \((0, 0)\) 到这个点的路径数量. 而在白色区域的这些玩偶都需要被执行分裂操作, 所以答案是白色区域的每个点可达玩偶数之和, 也就是在白色区域的每个点到 \((0, 0)\) 的路径数量之和.

一个点 \((i, j)\)\((0, 0)\) 的路径数量可用 \(\binom{i + j}{i}\) 表示, 从 \((0, 0)\) 一共走 \(i + j\) 步, 其中 \(i\) 步加在横坐标上.

固定横轴 \(i\) 那么根据题目要求, 需要执行操作的 \(j\) 满足 \(0 \leqslant j \lt a_i\). 那么对于固定的 \(i\), 单列答案为 \(\sum_{j = 0}^{a_i - 1}\binom{i + j}{i}\). 利用 Hockey-Stick 恒等式, 单列答案为 \(\binom{i + a_i}{i + 1}\).

对于所有的 \(i\), 最终答案为 \(ans = \sum_{i = 0}^{n}\binom{i + a_i}{i + 1} \bmod (10^9 + 7)\).

\(Code\)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;

const int NR = 4e5 + 10;
const long long mod = 1e9 + 7;

long long fac[NR];

long long quick_power(long long a, long long b)
{
	long long base = a, res = 1;
	while (b > 0)
	{
		if (b & 1) res = (res * base) % mod;
		base = (base * base) % mod;
		b >>= 1;
	}
	return res;
}

long long inv(long long x)
{
	return quick_power(x, mod - 2);
}

long long C(long long n, long long m)
{
	if (n < m) return 0ll;
	return fac[n] * inv(fac[n - m]) % mod * inv(fac[m]) % mod;
}

int a[NR];

int main()
{
	int n;
	scanf("%d", &n);
	int m = 0;
	for (int i = 0; i <= n; i ++)
	{
		scanf("%d", &a[i]);
		m = max(m, a[i]);
	}
	fac[0] = 1;
	for (int i = 1; i <= n + m; i ++)
	{
		fac[i] = fac[i - 1] * i % mod;
	}
	long long ans = 0;
	for (int i = 0; i <= n; i ++)
	{
		ans = (ans + C(i + a[i], i + 1)) % mod;
		//cout << i << " C " << i + a[i] << " " << i + 1 << endl;
	}
	printf("%lld\n", ans);
	return 0;
}
posted @ 2025-07-31 11:53  hsy8116  阅读(240)  评论(0)    收藏  举报