【题解】P7481 推柿子时刻

· · 题解

给定 n,对所有 1\leq a,b\leq m,求:

f(a,b)=\sum\binom bi\binom{n-i}a 显然很难 $O(1)$ 在线求出每个 $f$ 的值,因此考虑递推。 首先看到上面有个常数项 $b$,考虑将其拆开: $$ \begin{aligned} f(a,b)=&\sum\binom bi\binom{n-i}a\\ =&\sum\binom{b-1}i\binom{n-i}a+\sum\binom{b-1}{i-1}\binom{n-i}a\\ =&f(a,b-1)+\sum\binom{b-1}{i}\binom{n-i-1}a\\ \end{aligned} $$ 可以看见我们莫名其妙的把 $n-i$ 变为了 $n-i-1$,考虑变回去: $$ \begin{aligned} &\sum\binom{b-1}{i}\binom{n-i-1}a\\ =&\sum\binom{b-1}{i}\binom{n-i}a-\sum\binom{b-1}{i}\binom{n-i-1}{a-1}\\ =&f(a,b-1)-\sum\binom{b-1}{i}\binom{n-i-1}{a-1}\\ \end{aligned} $$ 无论怎么变,都无法将 $n-i-1$ 变没,但是我们已经把右下角 $a$ 变为 $a-1$,这是个突破性的进展(确信),因此考虑将 $\sum\binom{b-1}{i}\binom{n-i-1}{a-1}$ 左下方的 $i$ 变为 $i+1$: $$ \begin{aligned} &\sum\binom{b-1}{i}\binom{n-i-1}{a-1}\\ =&\sum\binom b{i+1}\binom{n-i-1}{a-1}-\sum\binom {b-1}{i+1}\binom{n-i-1}{a-1}\\ =&\sum\binom bi\binom{n-i}{a-1}-\sum\binom {b-1}i\binom{n-i}{a-1}\\ =&f(a-1,b)-f(a-1,b-1) \end{aligned} $$ 然后就推完了,总结下就是: $$ \begin{aligned} f(a,b)=&2f(a,b-1)-(f(a-1,b)-f(a-1,b-1))\\ =&2f(a,b-1)+f(a-1,b-1)-f(a-1,b) \end{aligned}$$ 边界就 $f(a,0)=\binom na$,$f(0,b)=\sum\binom bi=2^b$。 $\binom na$ 可以直接使用 $O(a+\log \text{mod})$ 的公式 $\frac{n\times(n-1)\times\cdots\times(n-a+1)}{a!}$ 计算。 ```cpp #include <cstdio> using namespace std; const int MAXN = 5005; const int mod = 998244353; int f[MAXN][MAXN]; int qkpow(int a, int b) { int ans = 1; for (; b; b >>= 1, a = 1ll * a * a % mod) if (b & 1) ans = 1ll * ans * a % mod; return ans; } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i <= m; i++) { int ans1 = 1, ans2 = 1; for (int j = n - i + 1; j <= n; j++) ans1 = 1ll * ans1 * j % mod; for (int j = 1; j <= i; j++) ans2 = 1ll * ans2 * j % mod; f[i][0] = 1ll * ans1 * qkpow(ans2, mod - 2) % mod; } for (int i = 0; i <= m; i++) f[0][i] = qkpow(2, i); for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) { f[i][j] = (2ll * f[i][j - 1] + f[i - 1][j - 1] + mod - f[i - 1][j]) % mod; } int ans = 0; for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) { ans ^= f[i][j]; } printf("%d\n", ans); return 0; } ```