LINK:差分与前缀和
这道题和loj的一个人的高三楼相似。
也略有不同 先考虑前缀和:设G(x)为原式的普通型生成函数 \(F(x)=1+x+x^2+...\)
那么其实求的是 \(G(x)*(F(x))^k\)的前n项。k很大 不能直接做多项式快速幂 想直接展开系数似乎也做不到。
利用Lucas定理 \(F(x)^k\equiv F(x)^{sp+r}\equiv F(x)^{sp}*F(x)^r (mod p)\)
后面的东西再次展开\((F(x)^p)^s*F(x)^r\) 忘了一件事情为了方便设\(F(x)=1+x\)
那么显见\(((1+x)^p)^s*F(x)^r=(1+x^p)^s*F(x)^r\)
由于最后求出前n项 所以上式等价于\(F(x)^r\)
其实这里取的\(F(x)\)有点特殊了实际上\(F(x)=\frac{1}{1-x}\)也是一样的。
对于差分也同理 所以可以使k直接对mod取模。
其实根据上式还可以反向证明Lucas定理 这里不再赘述。
考虑如何求出系数 可以使用多项式快速幂 也可以选择EXP那一套 当然最直观的是第i项系数为\(C(i+k-1,k-1)\)可以直接线性递推得到。
差分同理 至此问题得到解决。
code
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include