admin官方

20 分做法

直接按照定义计算。

先预处理阶乘和逆阶乘。对于每个 x=0,1,…,nx = 0, 1, \ldots, n,枚举 i=0,1,…,min⁡(k,x)i = 0, 1, \ldots, \min(k, x),用递推维护下降幂 xi‾x^{\underline{i}},累加

xi‾x! (n−x)!\frac{x^{\underline{i}}}{x!\,(n-x)!}

即可。

时间复杂度 O(nk)O(nk),可以通过 nn 较小的数据。


另有 20 分做法(k=0k = 0)

当 k=0k = 0 时,

f(x)=1x! (n−x)!.f(x)=\frac{1}{x!\,(n-x)!}.

因此

S(n)=∑x=0n1x! (n−x)!=1n!∑x=0n(nx)=2nn!.S(n)=\sum_{x=0}^{n}\frac{1}{x!\,(n-x)!} =\frac{1}{n!}\sum_{x=0}^{n}\binom{n}{x} =\frac{2^n}{n!}.

直接计算 2n⋅(n!)−1 mod p2^n \cdot (n!)^{-1} \bmod p 即可。


另有 20 分做法(k=1k = 1)

当 k=1k = 1 时,

f(x)=1+xx! (n−x)!.f(x)=\frac{1+x}{x!\,(n-x)!}.

于是

S(n)=∑x=0n1x! (n−x)!+∑x=0nxx! (n−x)!.S(n)=\sum_{x=0}^{n}\frac{1}{x!\,(n-x)!} +\sum_{x=0}^{n}\frac{x}{x!\,(n-x)!}.

第一部分为 2nn!\dfrac{2^n}{n!}。

第二部分中

∑x=0nx(nx)=n2n−1,\sum_{x=0}^{n}x\binom{n}{x}=n2^{n-1},

所以

∑x=0nxx! (n−x)!=n2n−1n!=2n−1(n−1)!.\sum_{x=0}^{n}\frac{x}{x!\,(n-x)!} =\frac{n2^{n-1}}{n!} =\frac{2^{n-1}}{(n-1)!}.

答案为

2nn!+2n−1(n−1)!.\frac{2^n}{n!}+\frac{2^{n-1}}{(n-1)!}.

100 分做法

关键是把分母中的阶乘改写为组合数:

1x! (n−x)!=1n!(nx).\frac{1}{x!\,(n-x)!}=\frac{1}{n!}\binom{n}{x}.

于是

S(n)=1n!∑i=0k∑x=0nxi‾(nx).S(n)=\frac{1}{n!}\sum_{i=0}^{k}\sum_{x=0}^{n}x^{\underline{i}}\binom{n}{x}.

当 x<ix<i 时,下降幂 xi‾x^{\underline{i}} 中包含因子 00,对应项为 00。因此只需要考虑 x≥ix\ge i。

对于内层求和,有

xi‾(nx)=x!(x−i)!⋅n!x! (n−x)!=n!(x−i)! (n−x)!.x^{\underline{i}}\binom{n}{x} =\frac{x!}{(x-i)!}\cdot\frac{n!}{x!\,(n-x)!} =\frac{n!}{(x-i)!\,(n-x)!}.

令 y=x−iy=x-i,则

∑x=inxi‾(nx)=∑x=inn!(x−i)! (n−x)!=ni‾∑y=0n−i(n−iy)=ni‾⋅2n−i.\begin{aligned} \sum_{x=i}^{n}x^{\underline{i}}\binom{n}{x} &=\sum_{x=i}^{n}\frac{n!}{(x-i)!\,(n-x)!} \\ &=n^{\underline{i}}\sum_{y=0}^{n-i}\binom{n-i}{y} \\ &=n^{\underline{i}}\cdot 2^{n-i}. \end{aligned}

代回原式:

S(n)=1n!∑i=0kni‾⋅2n−i.S(n)=\frac{1}{n!}\sum_{i=0}^{k}n^{\underline{i}}\cdot 2^{n-i}.

又因为

ni‾n!=n!(n−i)!⋅1n!=1(n−i)!,\frac{n^{\underline{i}}}{n!} =\frac{n!}{(n-i)!}\cdot\frac{1}{n!} =\frac{1}{(n-i)!},

所以

S(n)=∑i=0k2n−i(n−i)!.S(n)=\sum_{i=0}^{k}\frac{2^{n-i}}{(n-i)!}.

令 j=n−ij=n-i,得到

S(n)=∑j=n−kn2jj!.S(n)=\sum_{j=n-k}^{n}\frac{2^j}{j!}.

这正是级数 ∑2jj!\sum \dfrac{2^j}{j!} 的一段连续子和。

实现时不需要保存所有阶乘。若 p=2p=2,由 n<pn<p 可知只有 n=0n=0 或 n=1n=1,直接计算即可。

下面考虑 pp 为奇质数的情况。先线性计算 n! mod pn! \bmod p,再用费马小定理求出 (n!)−1(n!)^{-1},得到最后一项

2nn!.\frac{2^n}{n!}.

设

Tj=2jj!.T_j=\frac{2^j}{j!}.

则

Tj−1=Tj⋅j2.T_{j-1}=T_j\cdot\frac{j}{2}.

因此可以从 j=nj=n 倒着递推到 j=n−kj=n-k,边递推边累加答案。

由于题目保证 pp 为质数且 n<pn<p,所有 1,2,…,n1,2,\ldots,n 在模 pp 意义下都有逆元,阶乘也不为 00。

时间复杂度 O(n+k)O(n+k),由于 k≤nk\le n,也就是 O(n)O(n)。空间复杂度 O(1)O(1)。