求等幂和
Sk(n)=i=0∑n−1ik,(n≤109,k≤2000)
虽然这个题之前已经有很多优秀的 O(k) 做法,比如拉格朗日插值,以及转下降幂之后有限微积分,但是只针对这个问题,伯努利数的做法适用性更强。
首先由于等幂和的差分是 k 次多项式,所以等幂和是 k+1 次多项式,即:
Sk(n)=i=0∑k+1aini
由于要寻找 Sk(n) 与 n 的低次幂之间的关系,因此设生成函数:
Fn(x)=i=0∑Si(n)xi=j=0∑n−1i=0∑(jx)i=j=0∑n−11−jx1
然后,就寄了,因为这个加法毫无做法。
此时容易发现 1−x1 对应着指数生成函数中的 ex,而 ex 的加法可以等比数列,因此:
F^(x)=i=0∑Si(n)i!xi=j=0∑n−1ejx=1−ex1−enx
分子形式简单,直接去展开 1−ex1 ,分母常数项是 0 不太好,因此改成 1−exx:
1−exx=xi=0∑eix[xk+1]i=0∑eix=i=0∑k!ik=k!ζ(−k)
发现爆了,想了好久,结果是第一步有问题 /qd。
考虑一下这个等比数列,等比数列区间求和是没问题的,关键是现在是无限项求和,是什么给了我们这样这样展开的依据呢?
1−x1=i=0∑xi
这个是对的,把无限项求和的上界些出来试试?
N→∞limi=0∑Nxi=1−x1−xN+1
注意到此时我们保留前若干项的时候,xN+1 这一项不会产生影响,也就是在原来的无限序列上把最后的 xN 删掉是无影响的,因此可以去掉,保证了正确性。
但是在 exi 这里,最后的 eNx 会对前面的 [xk] 产生 −Nk 的贡献,因此无法删掉,所以上面第一步是错误的。
说回正题,那怎么求出 [xk]1−exx 呢?
考虑去推递推关系,令:
1−exx=i=0∑i!bixix=B^−exB^[k=1]=k!bk−i=0∑ki!1(k−i)!bk−i
此时其实就已经可以递推了,但还是推一下更优美的形式:
[k=1]k!=bk−i=0∑n(ik)bii=0∑n(in+1)bj=[n=0]
此时 b 数列叫做伯努利数。
回到最前面:
F^(x)=i=0∑Si(n)i!xi=1−ex1−enx=1−exxx1−enx[xk]x1−enx=(k+1)!nk+1(k≥0)
Sm(n)=[m!xm]F^m(x)=i=0∑mi!(m−i+1)!m!binm−i+1=m+11i=0∑m(im+1)binm−i+1
因此在 O(k2) 的预处理之后,可以 O(k) 求出一个 k 的等幂和的系数。
小技巧:如果题目要找 Sm(n+1) 的系数咋办?
弱智(我)的做法,直接二项式展开,但是这样单次给出系数就变成 O(k2) 了,非常不牛。
实际上,只需要考虑加上一个 nm,观察式子,容易发现把 b1 加一即可。
给个例题。
解生成函数等幂和
扩展一下上面的东西,求一下下面这个:
A(x)=i=0∑naixiS(A)=i=0∑naiik
先观察一下上面的等幂和,把关键式子写出来:
A(x)=i=0∑nxi=1−x1−xnF^(x)=1−ex1−enxS(A)=[k!xk]F^(x)
这提示我们把 x 换成 ex 来得到其指数生成函数,下面证明一下:
A(x)=i=0∑naixiF^(x)=i=0∑naiexi[k!xk]F^(x)=i=0∑naiik
已知长度为 n 等差数列 ai=A+Bi ,求 ∑i=0n−1aik
A(x)=xA(1−xB1−xnB)F^(x)=eAx(1−eBx1−enBx)1−exx=i=0∑i!bixi1−eBxx=i=0∑i!biBixiS(A)=[k!xk]=k+11i=0∑k(ik+1)biBi(ank−i+1−a0k−i+1)
已知两个数 A,B,保证 gcd(A,B)=1,求所有无法用 s=Ax+By(x,y≥0) 表示的 s 的 k 次方和。
A,B≤1018,k≤105 。
考虑 A,B 表出数的条件,如果只是满足 x≥0,y≥0,这样会算重,因此强制让 B>x≥0,这样一个能表出的数的表示方法就唯一了。
写出生成函数:
A(x)=xd−11−(1−xA)(1−xB)1−xABF^(x)=ex−11−(1−eAx)(1−eBx)1−eABx
和上面做法一样,把 eAx−11 用伯努利数展开,然后卷积一下就行。
复杂度 O(klogk)。