2022年7月5日和6日,day02
形式幂级数
多项式与形式幂级数
- 多项式: A ( x ) = ∑ i = 0 n a i x i A(x)=\sum_{i=0}^{n}a_ix^i A(x)=∑i=0naixi
- 形式幂级数:
A
(
x
)
=
∑
i
≥
0
a
i
x
i
A(x)=\sum_{i\ge 0}a_ix^i
A(x)=∑i≥0aixi
其中 a i ∈ K a_i\in K ai∈K, K K K 是一个域,通常,我们考虑 K = R K=\R K=R 或 K = Z p K=\Z_p K=Zp。
注意这里的 x x x 可以理解为一个独立于域 K K K 的一个符号。
形式幂级数的运算
设 A ( x ) = ∑ i ≥ 0 a i x i A(x)=\sum_{i\ge 0}a_ix^i A(x)=∑i≥0aixi, B ( x ) = ∑ i ≥ 0 b i x i B(x)=\sum_{i\ge 0}b_ix^i B(x)=∑i≥0bixi。
- 加法: A ( x ) + B ( x ) = ∑ i ≥ 0 ( a i + b i ) x i A(x)+B(x)=\sum_{i\ge 0}(a_i+b_i)x^i A(x)+B(x)=∑i≥0(ai+bi)xi
- 减法: A ( x ) − B ( x ) = ∑ i ≥ 0 ( a i − b i ) x i A(x)-B(x)=\sum_{i\ge 0}(a_i-b_i)x^i A(x)−B(x)=∑i≥0(ai−bi)xi
- 乘法:
A
(
x
)
×
B
(
x
)
=
∑
k
≥
0
(
∑
i
+
j
=
k
a
i
b
j
)
x
k
A(x)\times B(x)=\sum_{k\ge 0}(\sum_{i+j=k}a_ib_j)x^k
A(x)×B(x)=∑k≥0(∑i+j=kaibj)xk
可以验证,形式幂级数在以上定义的 + + +, − - −, × \times × 下形成一个环。 - 记号:记形式幂级数(或多项式) A ( x ) A(x) A(x) 的 x n x^n xn 项的系数为 [ x n ] A ( x ) [x^n]A(x) [xn]A(x)
常生成函数
定义:一个数列 { a n } \{a_n\} {an} 对应的常生成函数为 A ( x ) = ∑ n ≥ 0 a n x n A(x)=\sum_{n\ge 0}a_nx^n A(x)=∑n≥0anxn。
例子:
- 有两种物体,其中取 i i i 个第 1 种物体的方案数为 a i a_i ai ,取 j j j 个第 2 种物体的方案数为 b j b_j bj ,求取 k k k 个物体的方案数。
令 A ( x ) = ∑ i ≥ 0 a i x i , B ( x ) = ∑ i ≥ 0 b i x i 。 则 c k = ∑ i = 0 k a i b k − i C ( x ) = ∑ k ≥ 0 ∑ i = 0 k a i b k − i x k = A ( x ) × B ( x ) 令 A(x)=\sum_{i\ge 0}a_ix^i,B(x)=\sum_{i\ge 0}b_ix^i。\\ 则 c_k=\sum_{i=0}^{k}a_ib_{k-i}\\ C(x)=\sum_{k\ge 0}\sum_{i=0}^{k}a_ib_{k-i}x^k=A(x)\times B(x) 令A(x)=i≥0∑aixi,B(x)=i≥0∑bixi。则ck=i=0∑kaibk−iC(x)=k≥0∑i=0∑kaibk−ixk=A(x)×B(x)
答案为 [ x k ] C ( x ) [x^k]C(x) [xk]C(x)。
- 在一个自助水果店,有苹果、香蕉、草莓三种水果,你可以取 n n n 个水果,但是水果店要求,取的苹果数量必须是偶数,取的香蕉数量必须是 3 3 3 的倍数,取的草莓数量不能超过 5 5 5 个。求有多少种取 n n n 个水果的方案。
苹 果 : A ( x ) = ∑ i ≥ 0 , 2 ∣ i x i = 1 + x 2 + x 4 + x 6 + ⋯ 香 蕉 : B ( x ) = ∑ i ≥ 0 , 3 ∣ i x i = 1 + x 3 + x 6 + x 9 + ⋯ 草 莓 : C ( x ) = ∑ i = 0 5 x i = 1 + x + x 2 + x 3 + x 4 + x 5 S ( x ) = A ( x ) B ( x ) C ( x ) 苹果: A(x)=\sum_{i\ge 0,\ 2|i}x^i=1+x^2+x^4+x^6+\cdots \\ 香蕉: B(x)=\sum_{i\ge 0,\ 3|i}x^i=1+x^3+x^6+x^9+\cdots \\ 草莓: C(x)=\sum_{i=0}^5x^i=1+x+x^2+x^3+x^4+x^5 \\ S(x)=A(x)B(x)C(x) 苹果:A(x)=i≥0, 2∣i∑xi=1+x2+x4+x6+⋯香蕉:B(x)=i≥0, 3∣i∑xi=1+x3+x6+x9+⋯草莓:C(x)=i=0∑5xi=1+x+x2+x3+x4+x5S(x)=A(x)B(x)C(x)
答案为 [ x n ] S ( x ) [x^n]S(x) [xn]S(x)。
- 求不定方程 x 1 + x 2 + ⋯ + x k = n x_1+x_2+\cdots+x_k=n x1+x2+⋯+xk=n 的解的数量,其中 x i x_i xi 为整数,且 l i ≤ x i ≤ r i , ( 1 ≤ i ≤ k ) l_i\le x_i\le r_i, (1\le i\le k) li≤xi≤ri,(1≤i≤k)。
定 义 : F i ( x ) = x l i + x l i + 1 + x l i + 2 + ⋯ + x r i F ( x ) = F 1 ( x ) × F 2 ( x ) × ⋯ × F k ( x ) 定义:F_i(x)=x^{l_i}+x^{l_i+1}+x^{l_i+2}+⋯+x^{r_i}\\ F(x)=F_1(x)\times F_2(x)\times \cdots \times F_k(x) 定义:Fi(x)=xli+xli+1+xli+2+⋯+xriF(x)=F1(x)×F2(x)×⋯×Fk(x)
答案为 [ x n ] F ( x ) [x^n]F(x) [xn]F(x)。
- 求 x 1 + 2 x 2 + 3 x 3 = n x_1+2x_2+3x_3=n x1+2x2+3x3=n 的正整数解的个数。
F 1 ( x ) = ∑ i ≥ 1 x i = x + x 2 + x 3 + ⋯ F 2 ( x ) = ∑ i ≥ 1 , 2 ∣ i x i = x 2 + x 4 + x 6 + ⋯ F 3 ( x ) = ∑ i ≥ 1 , 3 ∣ i x i = x 3 + x 6 + x 9 + ⋯ F ( x ) = F 1 ( x ) F 2 ( x ) F 3 ( x ) F_1(x)=\sum_{i\ge 1}x^i = x + x^2 + x^3 + \cdots \\ F_2(x)=\sum_{i\ge 1,\ 2|i}x^i=x^2 + x^4 + x^6 + \cdots \\ F_3(x)=\sum_{i\ge 1,\ 3|i}x^i=x^3 + x^6 + x^9 + \cdots \\ F(x)=F_1(x)F_2(x)F_3(x) F1(x)=i≥1∑xi=x+x2+x3+⋯F2(x)=i≥1, 2∣i∑xi=x2+x4+x6+⋯F3(x)=i≥1, 3∣i∑xi=x3+x6+x9+⋯F(x)=F1(x)F2(x)F3(x)
答案为 [ x n ] F ( x ) [x^n]F(x) [xn]F(x)。
定理:设 S = { a 1 , a 2 , … , a k } S=\{a_1, a_2, \dots ,a_k\} S={a1,a2,…,ak},且 a i a_i ai 可以取的次数的集合为 M i M_i Mi ,记 F i ( x ) = ∑ u ∈ M i x u F_i(x)=\sum_{u\in M_i}x^u Fi(x)=∑u∈Mixu,则从 S S S 中取 n n n 个元素组合成集合的方案数 g ( n ) g(n) g(n) 的常生成函数 G ( x ) = ∑ i ≥ 0 g ( i ) x i G(x)=\sum_{i\ge 0}g(i)x^i G(x)=∑i≥0g(i)xi,满足:
G ( x ) = F 1 ( x ) F 2 ( x ) ⋯ F k ( x ) G(x)=F_1(x)F_2(x)\cdots F_k(x) G(x)=F1(x)F2(x)⋯Fk(x)
形式幂级数的逆元
- 形式幂级数 A ( x ) A(x) A(x) 的逆元: A ( x ) B ( x ) = 1 A(x)B(x)=1 A(x)B(x)=1
- 逆元存在条件: [ x 0 ] A ( x ) ≠ 0 [x^0]A(x)\not=0 [x0]A(x)=0
- 暴力计算方法:递推
假设
A ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n + ⋯ B ( x ) = b 0 + b 1 x + b 2 x 2 + ⋯ + b n x n + ⋯ A ( x ) B ( x ) = a 0 b 0 + ( a 0 b 1 + a 1 b 0 ) x + ⋯ + ( a 0 b n + a 1 b n − 1 + ⋯ + a n b 0 ) x n + ⋯ = 1 A(x) = a_0 + a_1x + a_2x^2 + \cdots + a_nx^n + \cdots \\ B(x) = b_0 + b_1x + b_2x^2 + \cdots + b_nx^n + \cdots \\ A(x)B(x)=a_0b_0 + (a_0b_1+a_1b_0)x + \cdots + (a_0b_n+a_1b_{n-1}+\cdots +a_nb_0)x^n + \cdots=1 A(x)=a0+a1x+a2x2+⋯+anxn+⋯B(x)=b0+b1x+b2x2+⋯+bnxn+⋯A(x)B(x)=a0b0+(a0b1+a1b0)x+⋯+(a0bn+a1bn−1+⋯+anb0)xn+⋯=1
那么
a 0 b 0 = 1 ⇒ b 0 = a 0 − 1 a 0 b 1 + a 1 b 0 = 0 ⇒ b 1 = − ( a 1 b 0 ) a 0 − 1 ⋮ ( a 0 b n + a 1 b n − 1 + ⋯ + a n b 0 ) = 0 ⇒ b n = − ( a 1 b n − 1 + ⋯ a n b 0 ) a 0 − 1 ⋮ \begin{aligned} a_0b_0=1 & \Rightarrow b_0 = a_0^{-1}\\ a_0b_1+a_1b_0 = 0 & \Rightarrow b_1 = -(a_1b_0)a_0^{-1}\\ &\vdots\\ (a_0b_n+a_1b_{n-1}+\cdots +a_nb_0)=0 & \Rightarrow b_n=-(a_1b_{n-1}+\cdots a_nb_0)a_0^{-1}\\ &\vdots \end{aligned} a0b0=1a0b1+a1b0=0(a0bn+a1bn−1+⋯+anb0)=0⇒b0=a0−1⇒b1=−(a1b0)a0−1⋮⇒bn=−(a1bn−1+⋯anb0)a0−1⋮
常见的逆:
- A ( x ) = 1 + x + x 2 + ⋯ A(x)=1+x+x^2+\cdots A(x)=1+x+x2+⋯ 和 B ( x ) = 1 − x B(x)=1-x B(x)=1−x,即 1 1 − x = ∑ i ≥ 0 x i \frac{1}{1-x}=\sum_{i\ge 0}x^i 1−x1=∑i≥0xi
- A ( x ) = 1 + a x + a 2 x 2 + ⋯ A(x)=1+ax+a^2x^2+\cdots A(x)=1+ax+a2x2+⋯ 和 B ( x ) = 1 − a x B(x)=1-ax B(x)=1−ax,即 1 1 − a x = ∑ i ≥ 0 a i x i \frac{1}{1-ax}=\sum_{i\ge 0}a^ix^i 1−ax1=∑i≥0aixi
- A ( x ) = ( k − 1 0 ) + ( k 1 ) x + ( k + 1 2 ) x 2 + ( k + 2 3 ) x 3 + ⋯ A(x)=\binom{k-1}{0}+\binom{k}{1}x+\binom{k+1}{2}x^2+\binom{k+2}{3}x^3+\cdots A(x)=(0k−1)+(1k)x+(2k+1)x2+(3k+2)x3+⋯ 和 B ( x ) = ( 1 − x ) k B(x)=(1-x)^k B(x)=(1−x)k,即 1 ( 1 − x ) k = ∑ i ≥ 0 ( i + k − 1 i ) x i \frac{1}{(1-x)^k}=\sum_{i\ge 0}\binom{i+k-1}{i}x^i (1−x)k1=∑i≥0(ii+k−1)xi
A ( x ) = ( 1 + x + x 2 + x 3 + ⋯ ) k 其 中 [ x n ] A ( x ) ⇔ x 1 + x 2 + ⋯ + x k = n , ( x i ≥ 0 ) 方 案 数 : ( n + k − 1 k − 1 ) = ( n + k − 1 n ) A(x)=(1+x+x^2+x^3+\cdots)^k \\ 其中[x^n]A(x)\Leftrightarrow x_1+x_2+\cdots+x_k=n,(x_i\ge 0)\\ 方案数:\binom{n+k-1}{k-1}=\binom{n+k-1}{n} A(x)=(1+x+x2+x3+⋯)k其中[xn]A(x)⇔x1+x2+⋯+xk=n,(xi≥0)方案数:(k−1n+k−1)=(nn+k−1)
例题1:https://ac.nowcoder.com/acm/contest/24710/A
- 肥宅快乐水最多1个: 1 + x 1+x 1+x
- 大盘鸡最多2个: 1 + x + x 2 1+x+x^2 1+x+x2
- 啤酒鸡最多3个: 1 + x + x 2 + x 3 1+x+x^2+x^3 1+x+x2+x3
- 鸡翅偶数个: 1 + x 2 + x 4 + ⋯ = 1 1 − x 2 = 1 ( 1 − x ) ( 1 + x ) 1+x^2+x^4+\cdots=\frac{1}{1-x^2}=\frac{1}{(1-x)(1+x)} 1+x2+x4+⋯=1−x21=(1−x)(1+x)1
- 鸡汤奇数个: x + x 3 + x 5 + ⋯ = x 1 − x 2 = x ( 1 − x ) ( 1 + x ) x+x^3+x^5+\cdots=\frac{x}{1-x^2}=\frac{x}{(1-x)(1+x)} x+x3+x5+⋯=1−x2x=(1−x)(1+x)x
- 鸡块个数为4的倍数: 1 + x 4 + x 8 + ⋯ = 1 1 − x 4 = 1 ( 1 − x ) ( 1 + x + x 2 + x 3 ) 1+x^4+x^8+\cdots=\frac{1}{1-x^4}=\frac{1}{(1-x)(1+x+x^2+x^3)} 1+x4+x8+⋯=1−x41=(1−x)(1+x+x2+x3)1
- 鸡腿最多1个: 1 + x 1+x 1+x
- 鸡蛋个数为3的倍数: 1 + x 3 + x 6 + ⋯ = 1 1 − x 3 = 1 ( 1 − x ) ( 1 + x + x 2 ) 1+x^3+x^6+\cdots=\frac{1}{1-x^3}=\frac{1}{(1-x)(1+x+x^2)} 1+x3+x6+⋯=1−x31=(1−x)(1+x+x2)1
( 1 + x ) ( 1 + x + x 2 ) ( 1 + x + x 2 + x 3 ) 1 ( 1 − x ) ( 1 + x ) × x ( 1 − x ) ( 1 + x ) 1 ( 1 − x ) ( 1 + x + x 2 + x 3 ) ( 1 + x ) 1 ( 1 − x ) ( 1 + x + x 2 ) = x ( 1 − x ) 4 = ( 3 0 ) x + ( 4 1 ) x 2 + ( 5 2 ) x 3 + ⋯ + ( n + 2 n − 1 ) x n + ⋯ \begin{aligned} &(1+x)(1+x+x^2)(1+x+x^2+x^3)\frac{1}{(1-x)(1+x)}\times\\ &\frac{x}{(1-x)(1+x)}\frac{1}{(1-x)(1+x+x^2+x^3)}(1+x)\frac{1}{(1-x)(1+x+x^2)}\\ =&\frac{x}{(1-x)^4}\\ =&\binom{3}{0}x+\binom{4}{1}x^2+\binom{5}{2}x^3+\cdots+\binom{n+2}{n-1}x^n+\cdots \end{aligned} ==(1+x)(1+x+x2)(1+x+x2+x3)(1−x)(1+x)1×(1−x)(1+x)x(1−x)(1+x+x2+x3)1(1+x)(1−x)(1+x+x2)1(1−x)4x(03)x+(14)x2+(25)x3+⋯+(n−1n+2)xn+⋯
答案为
( n + 2 n − 1 ) = ( n + 2 3 ) = ( n + 2 ) × ( n + 1 ) × n 3 × 2 × 1 = ( n + 2 ) ( n + 1 ) n 6 \binom{n+2}{n-1}=\binom{n+2}{3}=\frac{(n+2)\times(n+1)\times n}{3\times2\times1}=\frac{(n+2)(n+1)n}{6} (n−1n+2)=(3n+2)=3×2×1(n+2)×(n+1)×n=6(n+2)(n+1)n
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 1e5 + 50;
long long n;
long long fpow (long long x, long long p) {
long long ans = 1;
for (; p; p >>= 1, x = x * x % MOD)
if (p & 1) ans = ans * x % MOD;
return ans;
}
long long solve () {
n %= MOD;
return (n + 2) * (n + 1) % MOD * n % MOD;
}
int main () {
cin >> n;
cout << solve () * fpow (6, MOD - 2) % MOD << endl;
return 0;
}
例题2:https://ac.nowcoder.com/acm/contest/24710/B
每一朵花的生成函数:
F i ( x ) = 1 + x + x 2 + ⋯ + x f i = 1 − x f i + 1 1 − x F ( x ) = ∏ i = 1 n F i ( x ) = ∏ i = 1 n 1 − x f i + 1 1 − x = ∏ i = 1 n ( 1 − x f i + 1 ) ( 1 − x ) n F_i(x)=1+x+x^2+\cdots+x^{f_i}=\frac{1-x^{f_i+1}}{1-x}\\ F(x)=\prod_{i=1}^nF_i(x)=\prod_{i=1}^n\frac{1-x^{f_i+1}}{1-x}=\frac{\prod_{i=1}^n(1-x^{f_i+1})}{(1-x)^n}\\ Fi(x)=1+x+x2+⋯+xfi=1−x1−xfi+1F(x)=i=1∏nFi(x)=i=1∏n1−x1−xfi+1=(1−x)n∏i=1n(1−xfi+1)
记
A ( x ) = ∏ i = 1 n ( 1 − x f i + 1 ) B ( x ) = 1 ( 1 − x ) n = ∑ i ≥ 0 ( i + n − 1 i ) x i A(x)=\prod_{i=1}^n(1-x^{f_i+1})\\ B(x)=\frac{1}{(1-x)^n}=\sum_{i\ge 0}\binom{i+n-1}{i}x^i A(x)=i=1∏n(1−xfi+1)B(x)=(1−x)n1=i≥0∑(ii+n−1)xi
那么答案为
∑ i ( s − i + n − 1 s − i ) × [ x i ] A ( x ) = ∑ i ( s − i + n − 1 n − 1 ) × [ x i ] A [ x ] \sum_i\binom{s-i+n-1}{s-i}\times[x^i] A(x)=\sum_i\binom{s-i+n-1}{n-1}\times[x^i]A[x] i∑(s−is−i+n−1)×[xi]A(x)=i∑(n−1s−i+n−1)×[xi]A[x]
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 50;
const int MOD = 1e9 + 7;
struct node { long long x, y; } a[N];
long long f[25], n, s, cnt, inv[25], fnv[25];
void dfs (int step, long long v, long long c) {
if (step > n) return void(a[++ cnt] = {v, c});
dfs (step + 1, v, c);
dfs (step + 1, -v, c + f[step] + 1);
}
void init () {
fnv[0] = fnv[1] = inv[0] = inv[1] = 1;
for (int i = 2; i < n; i ++) {
inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
fnv[i] = fnv[i - 1] * inv[i] % MOD;
}
}
long long calc (long long x) {
if (x < 0) return 0;
x %= MOD;
long long res = 1;
for (int i = 1; i < n; i ++)
res = res * (x + i) % MOD;
return res * fnv[n - 1] % MOD;
}
int main () {
cin >> n >> s;
init ();
for (int i = 1; i <= n; i ++) cin >> f[i];
dfs (1, 1, 0);
long long ans = 0;
for (int i = 1; i <= cnt; i ++)
//cout << a[i].x << ' ' << a[i].y << endl,
ans = (ans + a[i].x * calc(s - a[i].y)) % MOD;
cout << (ans + MOD) % MOD << endl;
return 0;
}
例题3:https://ac.nowcoder.com/acm/contest/24710/C
每一个糖果的生成函数:
F i ( x ) = 1 + x + x 2 + ⋯ + x m i = 1 − x m i + 1 1 − x F ( x ) = ∏ i = 1 n F i ( x ) = ∏ i = 1 n 1 − x m i + 1 1 − x = ∏ i = 1 n ( 1 − x m i + 1 ) ( 1 − x ) n F_i(x)=1+x+x^2+\cdots+x^{m_i}=\frac{1-x^{m_i+1}}{1-x}\\ F(x)=\prod_{i=1}^nF_i(x)=\prod_{i=1}^n\frac{1-x^{m_i+1}}{1-x}=\frac{\prod_{i=1}^n(1-x^{m_i+1})}{(1-x)^n}\\ Fi(x)=1+x+x2+⋯+xmi=1−x1−xmi+1F(x)=i=1∏nFi(x)=i=1∏n1−x1−xmi+1=(1−x)n∏i=1n(1−xmi+1)
记
A ( x ) = ∏ i = 1 n ( 1 − x m i + 1 ) B ( x ) = 1 ( 1 − x ) n = ∑ i ≥ 0 ( i + n − 1 i ) x i A(x)=\prod_{i=1}^n(1-x^{m_i+1})\\ B(x)=\frac{1}{(1-x)^n}=\sum_{i\ge 0}\binom{i+n-1}{i}x^i A(x)=i=1∏n(1−xmi+1)B(x)=(1−x)n1=i≥0∑(ii+n−1)xi
那么答案为
∑ t = a b ∑ i ( t − i + n − 1 t − i ) × [ x i ] A ( x ) = ∑ t = a b ∑ i ( t − i + n − 1 n − 1 ) × [ x i ] A ( x ) = ∑ i [ x i ] A ( x ) × ∑ t = a b ( t − i + n − 1 n − 1 ) = ∑ i [ x i ] A ( x ) × ( ∑ t = a b ( t − i + n − 1 n − 1 ) + ( a − i + n − 1 n ) − ( a − i + n − 1 n ) ) = ∑ i [ x i ] A ( x ) × ( ( b − i + n n ) − ( a − i + n − 1 n ) ) \begin{aligned} &\sum_{t=a}^b\sum_i\binom{t-i+n-1}{t-i}\times[x^i] A(x) \\ =&\sum_{t=a}^b\sum_i\binom{t-i+n-1}{n-1}\times[x^i]A(x)\\ =&\sum_i[x^i]A(x)\times\sum_{t=a}^b\binom{t-i+n-1}{n-1}\\ =&\sum_i[x^i]A(x)\times\Bigg(\sum_{t=a}^b\binom{t-i+n-1}{n-1}+\binom{a-i+n-1}{n}-\binom{a-i+n-1}{n}\Bigg)\\ =&\sum_i[x^i]A(x)\times\Bigg(\binom{b-i+n}{n}-\binom{a-i+n-1}{n}\Bigg) \end{aligned} ====t=a∑bi∑(t−it−i+n−1)×[xi]A(x)t=a∑bi∑(n−1t−i+n−1)×[xi]A(x)i∑[xi]A(x)×t=a∑b(n−1t−i+n−1)i∑[xi]A(x)×(t=a∑b(n−1t−i+n−1)+(na−i+n−1)−(na−i+n−1))i∑[xi]A(x)×((nb−i+n)−(na−i+n−1))
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 50;
const int MOD = 2004;
long long n, a, b;
long long m[11];
long long C (long long x, long long y) {
if (y < 0 || x < y) return 0;
long long r = 1, p = MOD, ans = 1;
for (int i = 1; i <= y; i ++) p *= i, r *= i;
for (int i = 1; i <= y; i ++) ans = ans * (x - i + 1) % p;
return ans / r % MOD;
}
int main () {
cin >> n >> a >> b;
for (int i = 0; i < n; i ++) cin >> m[i];
long long ans = 0;
for (int i = 0; i < 1 << n; i ++) {
long long v = 1, c = 0;
for (int j = 0; j < n; j ++)
if (i >> j & 1) v *= -1, c += m[j] + 1;
ans = (ans + v * C(b - c + n, n) - v * C(a - c + n - 1, n)) % MOD;
}
cout << (ans + MOD) % MOD << endl;
return 0;
}
递推关系
例子:斐波那契数列满足 a 0 = 0 a_0=0 a0=0, a 1 = 1 a_1=1 a1=1, a n = a n − 1 + a n − 2 ( n ≥ 2 ) a_n=a_{n-1}+a_{n-2}(n\ge 2) an=an−1+an−2(n≥2),求其常生成函数。
A ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n + ⋯ = 0 + x + ( a 1 + a 0 ) x 2 + ( a 2 + a 1 ) x 3 + ⋯ + ( a n − 1 + a n − 2 ) x n + ⋯ = x + ( a 0 x 2 + a 1 x 3 + ⋯ + a n − 2 x n + ⋯ ) + ( a 1 x 2 + a 2 x 3 + ⋯ + a n − 1 x n + ⋯ ) = x + x 2 A ( x ) + x A ( x ) \begin{aligned} A(x)&=a_0+a_1x+a_2x^2+\cdots+a_nx^n+\cdots\\ &=0+x+(a_1+a_0)x^2+(a_2+a_1)x^3+\cdots+(a_{n-1}+a_{n-2})x^n+\cdots\\ &=x+(a_0x^2+a_1x^3+\cdots+a_{n-2}x^n+\cdots)+(a_1x^2+a_2x^3+\cdots+a_{n-1}x^n+\cdots)\\ &=x+x^2A(x)+xA(x) \end{aligned}\\ A(x)=a0+a1x+a2x2+⋯+anxn+⋯=0+x+(a1+a0)x2+(a2+a1)x3+⋯+(an−1+an−2)xn+⋯=x+(a0x2+a1x3+⋯+an−2xn+⋯)+(a1x2+a2x3+⋯+an−1xn+⋯)=x+x2A(x)+xA(x)
那么
(
1
−
x
−
x
2
)
A
(
x
)
=
x
⇒
A
(
x
)
=
x
1
−
x
−
x
2
⇒
A
(
x
)
=
1
5
(
1
1
−
1
+
5
2
x
−
1
1
−
1
−
5
2
x
)
⇒
A
(
x
)
=
∑
i
≥
0
1
5
[
(
1
+
5
2
)
i
−
(
1
−
5
2
)
i
]
x
i
⇒
a
n
=
1
5
[
(
1
+
5
2
)
n
−
(
1
−
5
2
)
n
]
\begin{aligned} &(1-x-x^2)A(x)=x\\ \Rightarrow &A(x)=\frac{x}{1-x-x^2}\\ \Rightarrow &A(x)=\frac{1}{\sqrt{5}}\Bigg(\frac{1}{1-\frac{1+\sqrt{5}}{2}x}-\frac{1}{1-\frac{1-\sqrt{5}}{2}x}\Bigg)\\ \Rightarrow &A(x)=\sum_{i\ge 0}\frac{1}{\sqrt{5}}\Bigg[\bigg(\frac{1+\sqrt{5}}{2}\bigg)^i-\bigg(\frac{1-\sqrt{5}}{2}\bigg)^i\Bigg]x^i\\ \Rightarrow &a_n=\frac{1}{\sqrt{5}}\Bigg[\bigg(\frac{1+\sqrt{5}}{2}\bigg)^n-\bigg(\frac{1-\sqrt{5}}{2}\bigg)^n\Bigg] \end{aligned}\\
⇒⇒⇒⇒(1−x−x2)A(x)=xA(x)=1−x−x2xA(x)=51(1−21+5x1−1−21−5x1)A(x)=i≥0∑51[(21+5)i−(21−5)i]xian=51[(21+5)n−(21−5)n]
扩展:假设数列
{
a
n
}
\{a_n\}
{an} 存在递推关系
a
n
=
c
1
a
n
−
1
+
c
2
a
n
−
2
+
⋯
+
c
k
a
n
−
k
a_n=c_1a_{n-1}+c_2a_{n-2}+\cdots+c_ka_{n-k}
an=c1an−1+c2an−2+⋯+ckan−k,求它对应的常生成函数
A
(
x
)
=
∑
n
≥
0
a
n
x
n
A(x)=\sum_{n\ge 0}a_nx^n
A(x)=∑n≥0anxn。
Catalan 数
递推公式:
c
0
=
1
,
c
1
=
1
c
n
=
c
0
c
n
−
1
+
c
1
c
n
−
2
+
⋯
+
c
n
−
1
c
0
=
∑
i
=
0
n
−
1
c
i
c
n
−
i
−
1
c_0=1,c_1=1\\ c_n=c_0c_{n-1}+c_1c_{n-2}+\cdots+c_{n-1}c_0=\sum_{i=0}^{n-1}c_ic_{n-i-1}
c0=1,c1=1cn=c0cn−1+c1cn−2+⋯+cn−1c0=i=0∑n−1cicn−i−1
那么
C
(
x
)
=
∑
n
≥
0
c
n
x
n
=
1
+
x
+
∑
n
≥
2
∑
i
=
0
n
−
1
c
i
c
n
−
i
−
1
x
n
=
1
+
x
+
∑
n
≥
1
∑
i
=
0
n
c
i
c
n
−
i
x
n
+
1
=
1
+
x
+
x
(
∑
n
≥
0
∑
i
=
0
n
c
i
c
n
−
i
x
n
−
c
0
c
0
)
=
1
+
x
+
x
(
C
2
(
x
)
−
1
)
\begin{aligned} C(x)&=\sum_{n\ge 0}c_nx^n\\ &=1+x+\sum_{n\ge 2}\sum_{i=0}^{n-1}c_ic_{n-i-1}x^n\\ &=1+x+\sum_{n\ge 1}\sum_{i=0}^nc_ic_{n-i}x^n+1\\ &=1+x+x\Big(\sum_{n\ge 0}\sum_{i=0}^nc_ic_{n-i}x^n-c_0c_0\Big)\\ &=1+x+x\big(C^2(x)-1\big) \end{aligned}\\
C(x)=n≥0∑cnxn=1+x+n≥2∑i=0∑n−1cicn−i−1xn=1+x+n≥1∑i=0∑ncicn−ixn+1=1+x+x(n≥0∑i=0∑ncicn−ixn−c0c0)=1+x+x(C2(x)−1)
解出
C
(
x
)
C(x)
C(x) 的表达式
C
(
x
)
=
1
±
1
−
4
x
2
x
⇒
C
(
x
)
=
1
−
1
−
4
x
2
x
\begin{aligned} &C(x)=\frac{1\pm\sqrt{1-4x}}{2x}\\ \Rightarrow &C(x)=\frac{1-\sqrt{1-4x}}{2x} \end{aligned}\\
⇒C(x)=2x1±1−4xC(x)=2x1−1−4x
由于
(
b
+
a
x
)
k
=
∑
n
≥
0
(
k
n
)
b
k
−
n
a
n
x
n
,
k
∈
R
(b+ax)^k=\sum_{n\ge 0}\binom{k}{n}b^{k-n}a^nx^n,k\in\R
(b+ax)k=n≥0∑(nk)bk−nanxn,k∈R
则
C
(
x
)
=
1
2
x
(
1
−
∑
n
≥
0
(
1
2
n
)
(
−
4
)
n
x
n
)
=
−
1
2
∑
n
≥
1
(
1
2
n
)
(
−
4
)
n
x
n
−
1
=
∑
n
≥
0
−
1
2
(
1
2
n
+
1
)
(
−
4
)
n
+
1
x
n
\begin{aligned} C(x) &= \frac{1}{2x}\bigg(1-\sum_{n\ge 0}\binom{\frac{1}{2}}{n}(-4)^nx^n\bigg)\\ &= -\frac{1}{2}\sum_{n\ge 1}\binom{\frac{1}{2}}{n}(-4)^nx^{n-1}\\ &= \sum_{n\ge 0}-\frac{1}{2}\binom{\frac{1}{2}}{n+1}(-4)^{n+1}x^n\\ \end{aligned}\\
C(x)=2x1(1−n≥0∑(n21)(−4)nxn)=−21n≥1∑(n21)(−4)nxn−1=n≥0∑−21(n+121)(−4)n+1xn
通项
c
n
c_n
cn 为
c
n
=
−
1
2
(
1
2
n
+
1
)
(
−
4
)
n
+
1
=
−
1
2
1
2
(
1
2
−
1
)
(
1
2
−
2
)
⋯
(
1
2
−
n
)
(
n
+
1
)
!
(
−
4
)
n
+
1
=
1
2
1
2
(
1
−
1
2
)
(
2
−
1
2
)
⋯
(
n
−
1
2
)
(
n
+
1
)
!
4
n
+
1
=
1
×
3
×
5
×
⋯
×
(
2
n
−
1
)
(
n
+
1
)
!
2
n
=
1
×
2
×
3
×
⋯
×
(
2
n
−
1
)
×
(
2
n
)
(
n
+
1
)
!
×
n
!
=
1
n
+
1
(
2
n
n
)
\begin{aligned} c_n &= -\frac{1}{2}\binom{\frac{1}{2}}{n+1}(-4)^{n+1}\\ &=-\frac{1}{2}\frac{\frac{1}{2}(\frac{1}{2}-1)(\frac{1}{2}-2)\cdots(\frac{1}{2}-n)}{(n+1)!}(-4)^{n+1}\\ &=\frac{1}{2}\frac{\frac{1}{2}(1-\frac{1}{2})(2-\frac{1}{2})\cdots(n-\frac{1}{2})}{(n+1)!}4^{n+1}\\ &=\frac{1\times 3\times 5\times \cdots \times (2n-1)}{(n+1)!}2^n\\ &=\frac{1\times 2\times 3\times \cdots \times (2n-1)\times(2n)}{(n+1)!\times n!}\\ &=\frac{1}{n+1}\binom{2n}{n} \end{aligned}\\
cn=−21(n+121)(−4)n+1=−21(n+1)!21(21−1)(21−2)⋯(21−n)(−4)n+1=21(n+1)!21(1−21)(2−21)⋯(n−21)4n+1=(n+1)!1×3×5×⋯×(2n−1)2n=(n+1)!×n!1×2×3×⋯×(2n−1)×(2n)=n+11(n2n)
指数生成函数
一个数列 { a n } \{a_n\} {an} 对应的指数生成函数为 A ( x ) = ∑ n ≥ 0 a n x n n ! A(x)=\sum_{n\ge 0}a_n\frac{x^n}{n!} A(x)=∑n≥0ann!xn。
例如,数列
a
n
=
1
a_n=1
an=1 ,其指数生成函数为:
A
(
x
)
=
1
+
x
+
x
2
2
!
+
x
3
3
!
+
⋯
+
x
n
n
!
+
⋯
=
e
x
=
e
x
p
(
x
)
A(x)=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots+\frac{x^n}{n!}+\cdots=e^x=exp(x)
A(x)=1+x+2!x2+3!x3+⋯+n!xn+⋯=ex=exp(x)
例子:
- 有两种物体,其中取 i i i 个第 1 种物体的方案数为 a i a_i ai ,取 j j j 个第 2 种物体的方案数为 b j b_j bj ,求取 k k k 个物体并排成一列的方案数。
c
k
=
∑
i
=
0
k
(
k
i
)
a
i
b
k
−
i
=
∑
i
=
0
k
k
!
i
!
×
(
k
−
i
)
!
a
i
b
k
−
i
⇒
c
k
k
!
=
∑
i
=
0
k
a
i
i
!
×
b
k
−
i
(
k
−
i
)
!
。
c_k=\sum_{i=0}^k\binom{k}{i}a_ib_{k-i}=\sum_{i=0}^k\frac{k!}{i!\times (k-i)!}a_ib_{k-i}\\ \Rightarrow \frac{c_k}{k!}=\sum_{i=0}^k\frac{a_i}{i!}\times\frac{b_{k-i}}{(k-i)!}。
ck=i=0∑k(ik)aibk−i=i=0∑ki!×(k−i)!k!aibk−i⇒k!ck=i=0∑ki!ai×(k−i)!bk−i。
记
A
(
x
)
A(x)
A(x) 和
B
(
x
)
B(x)
B(x) 分别为
A
(
x
)
=
a
0
+
a
1
x
1
!
+
a
2
x
2
!
+
⋯
+
a
n
x
n
!
+
⋯
A(x)=a_0+a_1\frac{x}{1!}+a_2\frac{x}{2!}+\cdots+a_n\frac{x}{n!}+\cdots \\
A(x)=a0+a11!x+a22!x+⋯+ann!x+⋯
B
(
x
)
=
b
0
+
b
1
x
1
!
+
b
2
x
2
!
+
⋯
+
b
n
x
n
!
+
⋯
B(x)=b_0+b_1\frac{x}{1!}+b_2\frac{x}{2!}+\cdots+b_n\frac{x}{n!}+\cdots \\
B(x)=b0+b11!x+b22!x+⋯+bnn!x+⋯
C
(
x
)
=
∑
k
≥
0
c
k
x
k
k
!
=
∑
k
≥
0
∑
i
=
0
k
a
i
i
!
b
k
−
i
(
k
−
i
)
!
x
k
=
A
(
x
)
×
B
(
x
)
C(x)=\sum_{k\ge 0}c_k\frac{x^k}{k!}=\sum_{k\ge 0}\sum_{i=0}^k\frac{a_i}{i!}\frac{b_{k-i}}{(k-i)!}x^k=A(x)\times B(x)
C(x)=k≥0∑ckk!xk=k≥0∑i=0∑ki!ai(k−i)!bk−ixk=A(x)×B(x)
答案为 [ x k ] C ( x ) × k ! [x^k]C(x)\times k! [xk]C(x)×k!。
- 用数字 1,2,3,4 作 6 位数字,每个数字在 6 位数中出现的次数不得大于2,求可以作出多少个不同的 6 位数。
每一个数字的生成函数为
F
(
x
)
=
1
+
x
+
x
2
2
!
G
(
x
)
=
F
4
(
x
)
F(x)=1+x+\frac{x^2}{2!}\\ G(x)=F^4(x)
F(x)=1+x+2!x2G(x)=F4(x)
答案为 [ x 6 ] G ( x ) × 6 ! [x^6]G(x)\times 6! [x6]G(x)×6!。
定理:设 S = { a 1 , a 2 , … , a k } S=\{a_1, a_2, \dots ,a_k\} S={a1,a2,…,ak},且 a i a_i ai 可以取的次数的集合为 M i M_i Mi ,记 F i ( x ) = ∑ u ∈ M i x u u ! F_i(x)=\sum_{u\in M_i}\frac{x^u}{u!} Fi(x)=∑u∈Miu!xu,则从 S S S 中取 n n n 个元素排成一列的方案数 g ( n ) g(n) g(n) 的常生成函数 G ( x ) = ∑ i ≥ 0 g ( i ) x i i ! G(x)=\sum_{i\ge 0}g(i)\frac{x^i}{i!} G(x)=∑i≥0g(i)i!xi,满足:
G ( x ) = F 1 ( x ) F 2 ( x ) ⋯ F k ( x ) G(x)=F_1(x)F_2(x)\cdots F_k(x) G(x)=F1(x)F2(x)⋯Fk(x)
公式(定义):
e
x
p
(
x
)
=
1
+
x
+
x
2
2
!
+
⋯
=
∑
n
≥
0
x
n
n
!
e
x
p
(
a
x
)
=
1
+
a
x
+
a
2
x
2
2
!
+
⋯
=
∑
n
≥
0
a
n
x
n
n
!
e
x
p
(
f
(
x
)
)
=
1
+
f
(
x
)
+
f
2
(
x
)
2
!
+
⋯
=
∑
n
≥
0
f
n
(
x
)
n
!
exp(x)=1+x+\frac{x^2}{2!}+\cdots=\sum_{n\ge 0}\frac{x^n}{n!}\\ exp(ax)=1+ax+a^2\frac{x^2}{2!}+\cdots=\sum_{n\ge 0}a^n\frac{x^n}{n!}\\ exp(f(x))=1+f(x)+\frac{f^2(x)}{2!}+\cdots=\sum_{n\ge 0}\frac{f^n(x)}{n!}\\
exp(x)=1+x+2!x2+⋯=n≥0∑n!xnexp(ax)=1+ax+a22!x2+⋯=n≥0∑ann!xnexp(f(x))=1+f(x)+2!f2(x)+⋯=n≥0∑n!fn(x)
例题4:https://ac.nowcoder.com/acm/contest/24710/D
定义
F
(
x
)
,
G
(
x
)
F(x),G(x)
F(x),G(x):
F
(
x
)
=
1
+
x
2
2
!
+
x
4
4
!
+
⋯
=
e
x
p
(
x
)
+
e
x
p
(
−
x
)
2
G
(
x
)
=
1
+
x
+
x
2
2
!
+
⋯
=
∑
n
≥
0
x
n
n
!
=
e
x
p
(
x
)
F(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}+\cdots=\frac{exp(x)+exp(-x)}{2}\\ G(x)=1+x+\frac{x^2}{2!}+\cdots=\sum_{n\ge 0}\frac{x^n}{n!}=exp(x)
F(x)=1+2!x2+4!x4+⋯=2exp(x)+exp(−x)G(x)=1+x+2!x2+⋯=n≥0∑n!xn=exp(x)
则方案数的生成函数
H
(
x
)
H(x)
H(x) 为:
H
(
x
)
=
F
2
(
x
)
G
2
(
x
)
=
(
e
x
p
(
x
)
+
e
x
p
(
−
x
)
2
)
2
e
x
p
(
x
)
2
=
e
x
p
(
x
)
2
+
2
+
e
x
p
(
−
x
)
2
4
e
x
p
(
2
x
)
=
e
x
p
(
4
x
)
+
2
e
x
p
(
2
x
)
+
1
4
=
∑
n
≥
0
1
4
(
4
n
+
2
⋅
2
n
)
x
n
n
!
+
1
4
\begin{aligned} H(x)&=F^2(x)G^2(x)\\ &=(\frac{exp(x)+exp(-x)}{2})^2exp(x)^2\\ &=\frac{exp(x)^2+2+exp(-x)^2}{4}exp(2x)\\ &=\frac{exp(4x)+2exp(2x)+1}{4}\\ &=\sum_{n\ge 0}\frac{1}{4}(4^n+2\cdot 2^n)\frac{x^n}{n!}+\frac{1}{4} \end{aligned}\\
H(x)=F2(x)G2(x)=(2exp(x)+exp(−x))2exp(x)2=4exp(x)2+2+exp(−x)2exp(2x)=4exp(4x)+2exp(2x)+1=n≥0∑41(4n+2⋅2n)n!xn+41
答案为
4
n
−
1
+
2
n
−
1
m
o
d
10007
4^{n-1}+2^{n-1} \mod 10007
4n−1+2n−1mod10007
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int MOD = 10007;
int T, n;
int fpow (int x, int p) {
int ans = 1;
for (; p ; p >>= 1, x = (long long)x * x % MOD)
if (p & 1) ans = (long long)ans * x % MOD;
return ans;
}
int main () {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> T;
while (T --) {
cin >> n;
cout << (fpow (4, n - 1) + fpow(2, n - 1)) % MOD << endl;
}
return 0;
}
例题5:https://ac.nowcoder.com/acm/contest/24710/E
每一次操作的贡献为:
r
e
s
u
l
t
+
=
a
1
a
2
⋯
a
x
⋯
a
n
−
a
1
a
2
⋯
(
a
x
−
1
)
⋯
a
n
result+=a_1a_2\cdots a_x\cdots a_n-a_1a_2\cdots (a_x-1)\cdots a_n
result+=a1a2⋯ax⋯an−a1a2⋯(ax−1)⋯an
由于中间状态都会消去,总的贡献为:
r
e
s
u
l
t
=
a
1
a
2
⋯
a
n
−
(
a
1
−
x
1
)
(
a
2
−
x
2
)
⋯
(
a
n
−
x
n
)
result = a_1a_2\cdots a_n-(a_1-x_1)(a_2-x_2)\cdots (a_n-x_n)
result=a1a2⋯an−(a1−x1)(a2−x2)⋯(an−xn)
∑
i
=
0
n
x
i
=
k
,
x
i
≥
0
\sum_{i=0}^nx_i=k,x_i\ge 0
i=0∑nxi=k,xi≥0
问题变为求
(
a
1
−
x
1
)
(
a
2
−
x
2
)
⋯
(
a
n
−
x
n
)
(a_1-x_1)(a_2-x_2)\cdots (a_n-x_n)
(a1−x1)(a2−x2)⋯(an−xn) 的期望:
E
[
(
a
1
−
x
1
)
(
a
2
−
x
2
)
⋯
(
a
n
−
x
n
)
]
=
∑
x
1
+
x
2
+
⋯
+
x
n
=
k
(
a
1
−
x
1
)
(
a
2
−
x
2
)
⋯
(
a
n
−
x
n
)
×
(
k
x
1
,
x
2
,
⋯
,
x
n
)
n
k
=
∑
x
1
+
x
2
+
⋯
+
x
n
=
k
(
a
1
−
x
1
)
x
1
!
(
a
2
−
x
2
)
x
2
!
⋯
(
a
n
−
x
n
)
x
n
!
×
k
!
n
k
=
k
!
n
k
∑
x
1
+
x
2
+
⋯
+
x
n
=
k
(
a
1
−
x
1
)
x
1
!
(
a
2
−
x
2
)
x
2
!
⋯
(
a
n
−
x
n
)
x
n
!
\begin{aligned} &\mathbb{E}\big[(a_1-x_1)(a_2-x_2)\cdots (a_n-x_n)\big]\\ =&\frac{\displaystyle\sum_{x_1+x_2+\cdots+x_n=k}(a_1-x_1)(a_2-x_2)\cdots (a_n-x_n)\times\binom{k}{x_1,x_2,\cdots,x_n}}{n^k}\\ =&\frac{\displaystyle\sum_{x_1+x_2+\cdots+x_n=k}\frac{(a_1-x_1)}{x_1!}\frac{(a_2-x_2)}{x_2!}\cdots \frac{(a_n-x_n)}{x_n!}\times k!}{n^k}\\ =&\frac{k!}{n^k}\displaystyle\sum_{x_1+x_2+\cdots+x_n=k}\frac{(a_1-x_1)}{x_1!}\frac{(a_2-x_2)}{x_2!}\cdots \frac{(a_n-x_n)}{x_n!} \end{aligned}
===E[(a1−x1)(a2−x2)⋯(an−xn)]nkx1+x2+⋯+xn=k∑(a1−x1)(a2−x2)⋯(an−xn)×(x1,x2,⋯,xnk)nkx1+x2+⋯+xn=k∑x1!(a1−x1)x2!(a2−x2)⋯xn!(an−xn)×k!nkk!x1+x2+⋯+xn=k∑x1!(a1−x1)x2!(a2−x2)⋯xn!(an−xn)
构造每一个
a
i
a_i
ai 对应的生成函数
F
i
(
x
)
=
∑
j
≥
0
(
a
i
−
j
)
j
!
x
j
=
∑
j
≥
0
a
i
j
!
x
j
−
∑
j
≥
0
j
j
!
x
j
=
∑
j
≥
0
a
i
j
!
x
j
−
x
∑
j
≥
0
1
j
!
x
j
=
a
i
e
x
p
(
x
)
−
x
e
x
p
(
x
)
\begin{aligned} F_i(x)&=\sum_{j\ge 0} \frac{(a_i-j)}{j!}x^j\\ &=\sum_{j\ge 0}\frac{a_i}{j!}x^j-\sum_{j\ge 0}\frac{j}{j!}x^j\\ &=\sum_{j\ge 0}\frac{a_i}{j!}x^j-x\sum_{j\ge 0}\frac{1}{j!}x^j\\ &=a_iexp(x)-xexp(x) \end{aligned}
Fi(x)=j≥0∑j!(ai−j)xj=j≥0∑j!aixj−j≥0∑j!jxj=j≥0∑j!aixj−xj≥0∑j!1xj=aiexp(x)−xexp(x)
则
F
(
x
)
F(x)
F(x) 为
F
(
x
)
=
∏
i
=
1
n
F
i
(
x
)
=
∑
k
≥
0
∑
x
1
+
x
2
+
⋯
+
x
n
=
k
(
a
1
−
x
1
)
x
1
!
(
a
2
−
x
2
)
x
2
!
⋯
(
a
n
−
x
n
)
x
n
!
x
k
=
e
x
p
(
n
x
)
×
∏
i
=
1
n
(
a
i
−
x
)
(
记
A
(
x
)
=
∏
i
=
1
n
(
a
i
−
x
)
)
=
∑
i
≥
0
n
i
x
i
i
!
×
A
(
x
)
=
∑
k
≥
0
∑
i
=
0
k
[
x
i
]
A
(
x
)
×
n
k
−
i
(
k
−
i
)
!
x
k
\begin{aligned} F(x)&=\prod_{i=1}^n F_i(x)\\ &=\sum_{k\ge 0}\sum_{x_1+x_2+\cdots+x_n=k}\frac{(a_1-x_1)}{x_1!}\frac{(a_2-x_2)}{x_2!}\cdots \frac{(a_n-x_n)}{x_n!}x^k\\ &=exp(nx)\times\prod_{i=1}^n(a_i-x)\ \ \ \ \ \ \ \ \ \ \Big(记A(x)=\prod_{i=1}^n(a_i-x)\Big)\\ &=\sum_{i\ge 0} n^i\frac{x^i}{i!} \times A(x)\\ &=\sum_{k\ge 0}\sum_{i=0}^k[x^i]A(x)\times\frac{n^{k-i}}{(k-i)!}x^k \end{aligned}
F(x)=i=1∏nFi(x)=k≥0∑x1+x2+⋯+xn=k∑x1!(a1−x1)x2!(a2−x2)⋯xn!(an−xn)xk=exp(nx)×i=1∏n(ai−x) (记A(x)=i=1∏n(ai−x))=i≥0∑nii!xi×A(x)=k≥0∑i=0∑k[xi]A(x)×(k−i)!nk−ixk
那么答案
[
x
k
]
F
(
x
)
[x^k]F(x)
[xk]F(x) 为:
∑
i
=
0
n
[
x
i
]
A
(
x
)
×
n
k
−
i
(
k
−
i
)
!
x
k
\sum_{i=0}^n[x^i]A(x)\times\frac{n^{k-i}}{(k-i)!}x^k
i=0∑n[xi]A(x)×(k−i)!nk−ixk
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 5050;
int n, k, a[N], f[N], g[N];
int b1[N], b2[N], c[N];
int fpow (int x, int p) {
int res = 1;
for (; p; p >>= 1, x = (long long) x * x % MOD)
if (p & 1) res = (long long)res * x % MOD;
return res;
}
void mul(int* b1, int* b2) {
memset (c, 0, sizeof (c));
for (int i = 0; i < 2; i ++)
for (int j = 0; j <= n; j ++)
c[i + j] = (c[i + j] + (long long)b1[j] * b2[i] % MOD) % MOD;
for (int i = 0; i <= n; i ++)
b1[i] = c[i];
}
int main () {
cin >> n >> k;
for (int i = 1; i <= n; i ++) cin >> a[i];
g[0] = f[0] = 1, g[1] = fpow (n, MOD - 2);
for (int i = 1; i <= n; i ++)
f[i] = (long long)(k - i + 1) * f[i - 1] % MOD;
for (int i = 2; i <= n; i ++)
g[i] = (long long)g[i - 1] * g[1] % MOD;
b1[0] = a[1], b1[1] = -1;
for (int i = 2; i <= n; i ++) {
b2[0] = a[i], b2[1] = -1;
mul (b1, b2);
}
int ans = 0, sum = 1;
for (int i = 0; i <= n; i ++)
ans = (ans + (long long)b1[i] * f[i] % MOD * g[i] % MOD) % MOD;
for (int i = 1; i <= n; i ++)
sum = (long long) sum * a[i] % MOD;
cout << ((long long)sum - ans + MOD) % MOD << endl;
return 0;
}