本文搬运自本人初中博客园博客,若图片加载不出来,可到原文查看:https://www.cnblogs.com/zhangtingxi/articles/15679108.html

题单

容斥和组合数

自我介绍

吕欣。活跃在 2016 - 2019 年的一个 OIer。参加过 NOI 2015 (铁牌),NOI 2016 (金牌)。2017 年进入清华大学姚班读书。在 2017 - 2019 年给各种 OI 比赛出过一些题(清华集训 2017 生成树计数;NOIWC 2019 I君的商店;NOI 2019 I君的探险;CTSC 2019 氪金手游),对(当时的)命题风格/环境/人有一定的了解。

邮箱:lyuxin1999@gmail.com

容斥好题

题1. (清华集训 主旋律)给定一个 NN 个点的有向图,问这个图有多少个强连通子图。保证 N15N\le 15

(也可以尝试去做完全图的情况:NN 个点的强连通图个数。)

解法

(图里可能有 N2N^2 条边)

简单问题:给定一个有向图,问有多少个子图是 DAG。

DP: f[S]f[S] 表示在点集 SS 之间删除一些边,使得剩下的图是个DAG的方案数。枚举哪些点的入度为 0,然后递归。

f[S]=TS,T2#edges(T,ST)f[ST].f[S] = \sum_{T\subseteq S, T\neq \varnothing} 2^{\#edges(T,S-T)} \cdot f[S-T].

但是这个递归式会算重:枚举的时候只保证了 TT 里的点入读为 0,但是 STS-T 可能也有入度为0的点。使用容斥:

f[S]=TS,T2#edges(T,ST)f[ST](1)T1.f[S] = \sum_{T\subseteq S,T\neq \varnothing} 2^{\#edges(T,S-T)} \cdot f[S-T]\cdot (-1)^{|T|-1}.

使用这个DP计算,计算量是 3N3^N

原题

一个图如果不强连通的话,那它就可以写成大于 1 个强连通分量连成的一个DAG。

强连通图的个数 = 所有图的个数 - 非强连通的个数。

尝试计算非强连通图的个数,枚举一个 TT,让 TT 连成一个强连通图,TT 不接受来自 STS-T 的边。

f[S]=ALL(S)TS,Tf[T]2ways(T,ST)ALL(ST).f[S] = ALL(S) - \sum_{T\subseteq S, T\neq \varnothing} f[T]\cdot 2^{ways(T,S-T)}\cdot ALL(S-T).

ALL(S) 表示所有可能的图的个数。

g[T]g[T] 表示:

  • 把集合 TT 划分成若干块,每一块里连成一个强连通块。如果有奇数个块:产生 1 的贡献;如果有偶数个块:产生 -1 的贡献。
  • g[T]g[T] 是所有的贡献之和。

f[S]=ALL(S)TS,Tg[T]2ways(T,ST)ALL(ST).f[S] = ALL(S) - \sum_{T\subsetneq S, T\neq \varnothing} g[T]\cdot 2^{ways(T,S-T)}\cdot ALL(S-T).

怎么算 gg?给定一个集合 SS,固定 xSx\in S,枚举 x 所在的强连通块:

g[S]=f[S]TS,xTf[T]g[ST]g[S] =f[S] -\sum_{T\subseteq S,x\in T} f[T]\cdot g[S-T]

题2. (ZJOI 小星星)给定一个 nn 个点 mm 条边的无向图和一个 nn 个点的树。问把这个树“嵌入”到这个图里的方案数。保证 n17n\le 17

做法 1:在树上DP,写 f[x][S][y]f[x][S][y] 表示处理了 x 为根的子树,图里的S这些点已经被用了,xx 被映射到了图里 y 这个点上。

f[x][S][y]f[ch[x]][S][y]1[(y,y)G]f[x][SS][y].f[x][S][y]\cdot f[ch[x]][S'][y'] \cdot \mathbf{1}[(y,y')\in G] \to f'[x][S\cup S'][y].

直接做是 O(3nn3)O(3^n\cdot n^3)可以用 FMT(快速莫比乌斯变换) 优化到 O(2nn3)O(2^n\cdot n^{3}).

做法 2:容斥。如果不考虑“每个图里的点都要用”,写一个DP:f[x][y]f[x][y] 表示 x 为根处理完,x 映射到 y 上的方案数。

这样做的话可能图里有些点没有被用到。枚举哪些点没有被用到,容斥。 O(2nn3)O(2^n\cdot n^3)

题3. (SHOI 黑暗前的幻想乡)给定一个 nn 个点的图。每条边被染上了 n1n-1 种颜色里的一种。问有多少个生成树包含了 n1n-1 个不同颜色的边。n17n\le 17。 (author:陈立杰)

如果没有颜色的限制:Matrix Tree 定理,O(n3)O(n^3)

有颜色限制:枚举哪些颜色没有被用到,做容斥。O(2nn3)O(2^nn^3)

题4. (随机 K 大值),现在有 NN 个独立的随机变量,第 ii 个变量 XiX_i 服从 [Li,Ri][L_i, R_i] 上的均匀分布。问 X1,,XNX_1,\dots, X_N 中的第 KK 大的数的期望。N50,Li,Ri100N\le 50, L_i,R_i\le 100

考虑简单版本:Li=0,Ri=100L_i = 0, R_i = 100 (从 [0, 100] 里均匀独立地随机 N 个数,问其中第 K 大的期望是多少。)

通常的容斥:有 NN 个限制条件,问有多少种方案 (1) 满足至少一个限制条件 / (2) 不满足任何限制条件。

如果我们问 (3) 有多少种方案满足恰好 K 个限制条件? (3‘)有多少方案满足至少 K 个条件。

f[S]f[S] 表示满足并且只满足集合 S 里的限制条件的方案数。用 g[S]g[S] 表示至少满足了集合 S 里的限制条件的方案数。

g[S]=STf[T].g[S] = \sum_{S\subseteq T} f[T].

由反演公式:

f[T]=TSg[S](1)ST.f[T] = \sum_{T\subseteq S} g[S]\cdot (-1)^{|S-T|}.

那么问题 1 的答案是:

Sf[S]=ALLf[]=ALLSg[S](1)S=Sg[S](1)S1.\sum_{S\neq \varnothing} f[S] = ALL - f[\varnothing] = ALL - \sum_{S} g[S]\cdot (-1)^{|S|} = \sum_{S\ne \varnothing} g[S]\cdot (-1)^{|S|-1}.

这里是因为 g[]=ALLg[\varnothing] = ALL

问题 (3):

S=Kf[S]=S=KSTg[T](1)TS=S=Kg[T]ST,S=K(1)TS=S=Kg[T](SK)(1)SK\sum_{|S| = K} f[S] = \sum_{|S|=K}\sum_{S\subseteq T} g[T]\cdot (-1)^{|T-S|} \\ = \sum_{|S|= K} g[T] \cdot \sum_{S\subseteq T,|S|= K} (-1)^{|T-S|} \\ = \sum_{|S|= K} g[T] \cdot {|S|\choose K}\cdot (-1)^{|S|-K} \\

问题 (3’):

SKf[S]=SKSTg[T](1)TS=TKg[T]SK,ST(1)TS=TKg[T]A(T,K).\sum_{|S|\ge K} f[S] = \sum_{|S|\ge K}\sum_{S\subseteq T} g[T]\cdot (-1)^{|T-S|} \\ =\sum_{|T|\ge K} g[T]\sum_{|S|\ge K, S\subseteq T} (-1)^{T-S} \\ = \sum_{|T|\ge K} g[T] \cdot A(|T|, K).

其中 A(n,k)=i=kn(ni)(1)niA(n, k) = \sum_{i = k}^{n} \binom{n}{i}\cdot (-1)^{n-i}.

(作为一个特殊情形,考虑 k=1k=1 的时候,i=1n(1)ni(ni)=(1)n+1\sum_{i=1}^{n} (-1)^{n-i}{n\choose i} = (-1)^{n+1},此时得到奇偶错位求和)。

ANS=0RPr[第 K 大 数x]dx=0RPr[K个数x]dx=0R(SKf[S])dx=0R(SKg[S]cS)dxANS = \int_{0}^{R} \Pr[\text{第 K 大 数} \ge x] dx \\ =\int_0^R \Pr[ \exists K 个数 \ge x ] dx\\ =\int_0^R (\sum_{|S|\ge K} f[S])dx \\ = \int_0^R (\sum_{|S|\ge K} g[S] \cdot c_{|S|})dx

其中 f[S]f[S] 表示 XixX_i \ge x 对任意 iSi\in S 成立,并且 Xi<xX_i < x 对任意的 iSi\notin S 成立。

g[S]g[S] 表示 XixX_i\ge x 对任意 iSi\in S 成立。cSc_{|S|} 是一个容斥系数。(这个概率就是 iSRxR\prod_{i\in S} \frac{R-x}{R},对 xx 积分即可)。

Li,RiL_i,R_i 不一定一样的时候:把 [0,+)[0, +\infty) 按照 Li,RiL_i, R_i 分段,每一段用上述技巧计算多项式,求积分。(ABC:Random K-th Max)

题5. (BZOJ 已经没有什么好害怕的了) 给定两个长度为 NN 的数组 {Ai}\{A_i\}{Bi}\{B_i\},现在要把他们配对起来,使得恰好有 KK(A,B)(A,B) 满足 ABA\ge B,求方案数。N2000N\le 2000

考虑一个暴力容斥:

枚举集合 AA 里的 tt 个数构成的集合 SS,要求他们必须匹配到比自己小的,其余的NtN-t 个数随意,求方案数。

暴力枚举完所有可能情况,可以算出 g[t]g[t]:表示在集合A里钦定了 t 个数,保证它们的匹配对象比自己要小,其他随意的方案数。

g[t]g[t] 反演出 f[t]f[t]:恰好有 t个A中的数,满足他们的匹配对象比自己小。答案就是 f[K]f[K].

优化:用一个DP来计算 gg。令 dp[i][j]dp[i][j] 表示在集合 A 的前 i 个数里,钦定了 j 个数的匹配对象比自身小,的方案数之和。

dp[i][j]dp[i+1][j]dp[i][j]×([Ai+1小的数的个数]j)dp[i+1][j+1].dp[i][j] \to dp[i + 1][j] \\ dp[i][j] \to \times ([比 A_{i+1} 小的数的个数] - j) \to dp[i + 1][j + 1].

dp[N][t](Nt)!=g[t]dp[N][t]\cdot (N-t)! = g[t]

运算量是 O(N2)O(N^2)

题6. (Atcoder Beginner Contest-???) 给定一个 1N1\sim N 的排列 PP。问有多少 iji\ne j 满足 gcd(i,j)>1gcd(i,j) > 1gcd(Pi,Pj)>1gcd(P_i, P_j) > 1N2×105N\le 2\times 10^5

简单问题:有多少 (i,j)(i,j) 满足 gcd(Pi,Pj)>1gcd(P_i, P_j) > 1(不考虑 gcd(i,j)>1gcd(i,j) > 1 的限制)。容斥(莫比乌斯反演)

  • 计算有多少 (i,j)(i, j) 满足 $2 | (P_i,P_j) $:加上。
  • 计算多少满足 3(Pi,Pj)3 | (P_i, P_j):加上。
  • 计算有多少 6(Pi,Pj)6|(P_i, P_j):减掉。
  • 。。。
  • 计算有多少 d(Pi,Pj)d|(P_i, P_j):产生 μ(d)-\mu(d) 的贡献。

ANS=d=1Nμ(d)(d的倍数的个数2)ANS = \sum_{d=1}^N \mu(d) \cdot \binom{d的倍数的个数}{2}

可以实现一个数据结构,支持插入一个数,删除一个数;询问集合里有多少个互质的pair。

  • 每次插入/删除一个数 xx 的时候,枚举 xx 的约数 dd,更新 dd 的倍数的个数。同时更新 ANS。
  • 每次对数据结构的操作时间是2ω(x)N2^{\omega(x)}\le \sqrt{N},其中 ω(x)\omega(x)表示 x 不同的质因子的个数。

原题:现在带上了 i j 的限制。

  • 只考虑 2(i,j)2|(i, j) 的那些下标,计算一遍简单问题。产生 1 的贡献
  • 枚举 3(i,j)3 | (i, j) 的下标,计算一遍简单问题。产生 1 的贡献
  • 。。。
  • 枚举 d(i,j)d|(i,j) 的下标,计算一遍简单问题。产生 μ(d)-\mu(d) 的贡献。

总共会对数据结构进行 O(NlogN)O(N\log N) 次更新。

计算量O(NNlogN)O(N\sqrt{N}\log N).

组合数

定义(NK)=N!K!(NK)!{N\choose K}=\frac{N!}{K!(N-K)!} 为从 N 个物品中取出 K 个的方案数。

常用公式

  • i=0N(Ni)=2N\sum_{i=0}^N \binom{N}{i} = 2^N.

  • i=0N(Ni)(1)i=0\sum_{i=0}^{N} \binom{N}{i}(-1)^i = 0.

  • i=0N(Ni)xi=(1+x)N\sum_{i=0}^{N} \binom{N}{i}x^i = (1+x)^N.

  • i=0K(Ni)(MKi)=(N+MK)\sum_{i=0}^K \binom{N}{i}\binom{M}{K - i} = \binom{N+M}{K}. 范德蒙公式 i=0N(Ni)(Mi)=i(Ni)(MMi)=(N+MM)\sum_{i=0}^{N}{N\choose i}{M\choose i} = \sum_i {N\choose i}{M\choose M-i}={N+M\choose M}

  • (NK)(Ki)=(Ni)(NiKi)\binom{N}{K}\binom{K}{i} = \binom{N}{i}\binom{N-i}{K-i}. 例子 kf(i)i(NK)(Ki)=i(Ni)f(i)K(NiKi)=if(i)(Ni)2Ni\sum_k f(i)\sum_i {N\choose K}{K\choose i} = \sum_i{N\choose i}f(i)\sum_K{N-i\choose K-i}=\sum_i f(i){N\choose i} 2^{N-i}.

  • (Ni)=(N1i1)+(N1i)=(N1i1)+(N2i1)+(N2i)=...=t=i1N1(N1i1)\binom{N}{i} = \binom{N - 1}{i - 1} + \binom{N-1}{i}=\binom{N - 1}{i - 1} + \binom{N-2}{i-1}+\binom{N-2}{i}=...=\sum_{t=i-1}^{N-1} {N-1\choose i-1}.

  • (N+1K+1)=i=KN(iK)\binom{N+1}{K+1} = \sum_{i=K}^{N} \binom{i}{K} (想象 N+1 个物品里选 K+1 个,我枚举第一个被选中的物品是第几个)。

    • 等价地,(N+1K+1)=i=KN(iiK)\binom{N+1}{K+1} = \sum_{i=K}^N \binom{i}{i-K}.
  • i=0K(N+1i)=i(Ni)+(Ni1)=2i=0K(Ni)(NK)\sum_{i=0}^{K} {N+1\choose i} =\sum_i {N\choose i}+{N\choose i-1}= 2\sum_{i=0}^{K}{N\choose i} - {N\choose K}.

  • Lucas 定理(SHOI 超能粒子炮;(例题2)[https://nanti.jisuanke.com/t/A1245])

题1. (LOJ 博弈论与概率统计)共有 TT 组询问,每次给定 N,KN,K,计算 i=0K(Ni)\sum_{i=0}^{K}\binom{N}{i},保证 K,N105,T105K,N\le 10^5, T\le 10^5

f(N,K)f(N,K) 表示答案。那么 f(N,K)=f(N1,K)2(NK)f(N,K)=f(N-1,K)\cdot 2 - {N\choose K}f(N,K)=f(N,K1)+(NK)f(N,K) = f(N, K-1)+{N\choose K}

当我们知道 f(N,K)f(N,K),可以在 O(1)O(1) 时间内算出 f(N+1,K)f(N+1,K)f(N,K+1)f(N, K+1)

莫队,O(TN+M)O(T\cdot \sqrt{N+M}).

题2. (Atcoder BBQ Hard) 给定正整数数组 (ai)i=1N(a_i)_{i=1}^N(bj)j=1N(b_j)_{j=1}^N,计算 ij(ai+aj+bi+bjai+aj)\sum_{i\ne j} \binom{a_i+a_j+b_i+b_j}{a_i+a_j},保证 N105,ai,bj2000N\le 10^5, a_i,b_j\le 2000

相当于从 (ai,bi)(-a_i, -b_i) 走到 (aj,bj)(a_j, b_j),每次向右或者向上一步的方案数。对 i、j 求和相当于需要自选起点 i 和终点 j。做一个DP。

题3. 有一个 N×NN\times N 的网格图,其中有 KK 个障碍点。计算从 (1,1)(1,1) 移动到 (N,N)(N,N),每次向右或者下走一步,中间不经过任何障碍点的方案数。保证 N105,K2000N\le 10^5, K \le 2000

Skipped.

加强版:从 (1,1,1)(1, 1, 1) 移动到 (N,M,K)(N,M,K),每次选择一个维度走。

形如 (i,i,i)(i, i, i) 以及 (Ni,Mi,Ki)(N-i,M-i, K-i) 的点都是障碍点。求方案数。 N,M,K105N,M,K\le 10^5

FFT + 生成函数 (多项式求逆)。

Skipped.

题4. (Atcoder - ARC118E) 有一个 (N+2)×(N+2)(N+2)\times (N+2) 的网格图。对于一个 NN 元排列 PP,我们把 {(i,Pi)}\{(i,P_i)\} 标记为 NN 个障碍点,然后求从 (0,0)(0,0) 移动到 (N+1,N+1)(N+1,N+1) 的,不经过障碍的路径方案数。对于所有可能的排列 PP,求不经过障碍的方案数的总和。 N100N\le 100.

原题:排列的一部分已经填好,只需要填剩下的位置。

如果排列已经给定的话:容斥:f[x][y]f[x][y] 表示走到 x、y 这个位置, 经过并标记了偶数个障碍的方案数 - 经过并标记了奇数个障碍方案数。f[x][y]f[x+1][y]/f[x][y+1]f[x][y]\to f[x+1][y]/f[x][y + 1]

排列没有给定的话:把生成排列的过程也放进DP 里. f[x][y][k][flag]f[x][y][k][flag] 表示在 x、y 这个位置,排列里确定了 k 个元素。flag:当前行 / 列是否已经放了一个障碍。经过并标记了偶数个障碍的方案数 - 经过并标记了奇数个障碍方案数。

枚举 (1) 在当前位置是否放障碍 /(2)向那个方向走。 O(N3)O(N^3)

  • 进入一个新的行/列:可以知道当前行列是否已经有障碍。
  • 因为有 flag,所以我们放的障碍一定保证不同行不同列。
  • 我们记录了 k,我们放的障碍个数。这相当于说把排列里 K 个位置填好了。DP结束的时候乘 (Nk)!(N-k)! 来保证生成的是一个排列。

题5. (AGE - Yes or No) 从一个 N×MN\times M 的网格图的 (0,0)(0,0) 移动到 (N,M)(N,M),经过一个点 (i,j)(i,j) 的时候可以获得 max(i,j)i+j\frac{\max(i,j)}{i+ j} 的得分。求所有可能的路径的得分之和。N,M106N, M\le 10^6

i,j(i+ji)(Ni+MjNi)max(i,j)i+j=i1i!(Ni)!j(i+j)!(N+Mij)!j!(Mj)!ii+j=i1i!(Ni)!j\sum_{i,j} {i+j\choose i} \binom{N-i+M-j}{N-i}\frac{\max(i,j)}{i+j} \\ =\sum_i \frac{1}{i!(N-i)!} \sum_j \frac{(i+j)!\cdot (N+M-i-j)!}{j!(M-j)!} \frac{i}{i+j}\\ = \sum_i \frac{1}{i!(N-i)!}\sum_j

正常做法:从小到大枚举 i+j=si+j=s,想计算

i(si)(N+MsNi)max(i,j)s\sum_{i} \binom{s}{i}\binom{N+M-s}{N-i} \frac{\max(i, j)}{s}

我们分别计算

Ai(s)=1si(si)(N+MsNi)i[is/2].A_i(s) =\frac{1}{s} \sum_i \binom{s}{i} \binom{N+M-s}{N-i}\cdot i \cdot [i\ge s/2] .

Aj(s)=i(si)(N+MsNi)ji[i<s/2]A_j(s) =\sum_i \binom{s}{i} \binom{N+M-s}{N-i}\frac{j}{i} \cdot [i < s/2]

考虑从 ss 转移到 s+1s+1

Ai(s+1)=1s+1i(s+1i)(N+Ms1Ni)i[i(s+1)/2].A_i(s+1)=\frac{1}{s+1}\sum_{i} \binom{s+1}{i}\binom{N+M-s-1}{N-i}\cdot i\cdot [i\ge (s+1)/2].

(s+1)Ai(s+1)sAi(s)=i((si)+(si1))(N+Ms1Ni)i[i(s+1)/2]i(si)((N+Ms1Ni)+(N+Ms1Ni1))i[is/2](s+1)A_i(s+1) - sA_i(s) \\ = \sum_{i} \left( \binom{s}{i} + \binom{s}{i-1} \right) \binom{N+M-s-1}{N-i}\cdot i\cdot [i\ge (s+1)/2] \\ -\sum_i \binom{s}{i}\left( \binom{N+M-s-1}{N-i} +\binom{N+M-s-1}{N-i-1}\right) \cdot i \cdot [i\ge s/2]

这里注意到 (si)(N+Ms1Ni)\binom{s}{i}\binom{N+M-s-1}{N-i} 可以和 (si)(N+Ms1Ni)\binom{s}{i}\binom{N+M-s-1}{N-i} 消掉。(si1)(N+Ms1Ni)\binom{s}{i-1}\binom{N+M-s-1}{N-i} 可以错位和 (si)(N+Ms1Ni1)\binom{s}{i}\binom{N+M-s-1}{N-i-1} 消掉。因为只需要特殊计算 i(s+1)/2i\approx (s+1)/2O(1)O(1) 项即可。

(可以做 O(1)O(1) 递推)。

神棍做法:不妨设 NMN\ge M

max(i,j)i+j\frac{\max(i,j)}{i+j} 相当于说:还有 ii 个 “yes” 和 jj 个 “no” 在我的前面。我不知道他们出现的顺序,但是我想猜下一个位置是 yes 或者 no。我应该猜个数比较多的,我的成功率就是 max(i,j)i+j\frac{\max(i,j)}{i+j}.

原问题相当于说,从 i,j=(n,m)i,j = (n,m) 开始,每次猜下一个是 yes 或者 no,猜对了得分,猜错了不得分。问期望的总得分。

如果总是 iji\ge j 的话:我会一直猜 Yes,最后n+mn+m轮里有 nn 轮猜对,得 nn 分。

如果 i=ji=j

  • 如果猜错了:(i,j)=>(i,j1)(i,j) => (i, j-1) 没有得分,但是仍然有iji\ge j
  • 如果猜对了:(i,j)=>(i1,j)(i,j)=>(i-1,j),这个局面和 (i,j1)(i,j-1) 是等价的。所以这里相当于我"白赚"了0.5分。

所以答案是

N+i=0N(2ii)(N+M2iNi)2(N+MN).N + \frac{\sum_{i=0}^N{2i\choose i}{N+M-2i\choose N-i}}{2\cdot {N+M\choose N}}.

题6. 组合数取模:计算 (NM)modP\binom{N}{M}\bmod P

  • 版本 1:P=109+7P= 10^9+7N,M109N, M\le 10^9.
  • 版本 2:PP 是一个小质数 (Lucas 定理).
  • 版本 3:P=310P = 3^{10}N,M1018N,M\le 10^{18}.
  • 版本 3 加强版:P=320P=3^{20}N,M1018N,M\le 10^{18}.

基于拉格朗日插值的多项式求和

拉格朗日插值. 假设 PP 是一个度数为 DD 的多项式。如果我们知道 PPD+1D+1 个不同位置的取值 (x1,P(x1)),,(xD,P(xD))(x_1,P(x_1)),\dots, (x_D,P(x_D)),那么我们可以唯一地把 PP 写为

P(x)=i=1D+1P(xi)ji(xxj)ji(xixj).P(x) = \sum_{i=1}^{D+1} P(x_i) \frac{\prod_{j\ne i} (x-x_j)}{\prod_{j\ne i}(x_i-x_j)}.

多项式的部分和. 假设 P:NRP:\mathbb{N}\to \mathbb{R} 可以表示为一个度数为 DD 的多项式,那么我们考虑函数 Q:NRQ:\mathbb{N}\to \mathbb{R}

Q(n)=inP(i).Q(n) = \sum_{i\le n} P(i).

可以证明 QQ 可以表示为一个度数为 D+1D+1 的多项式,并且这个表示方法是唯一的。

如果已知 QQ0,1,,D0,1,\dots, D 这些输入上的输出,那么对于任意给定的数 nn,可以在 O(D)O(D) 时间内计算出 Q(n)Q(n)算法:按照拉格朗日插值公式,只需要对每个 i{0,,D}i\in \{0,\dots, D\} 计算 ji(nj)\prod_{j\ne i} (n - j)ji(ij)\prod_{j\ne i} (i - j)。对于前者,我们只需要计算一个数列 (n0),(n1),,(nD)(n-0),(n-1),\dots, (n-D),然后取一个前缀积和一个后缀积即可。对于后者,可以发现它就是 (i1)!(Di)!(1)Di(i-1)!\cdot (D-i)!\cdot (-1)^{D-i}。因此,整个计算可以在 O(D)O(D) 时间内完成。

题1. 给定 N,KN,K,计算 i=0NiK\sum_{i=0}^{N} i^K. 保证 K105K\le 10^5.

题1 加强版. 给定 N,K,qN,K,q,计算 i=0NiKqi\sum_{i=0}^N i^K q^i. 保证 K105K\le 10^5.