题目链接:超能粒子炮·改
这道题的大体思路就是用(lucas)定理,然后合并同类项,就可以得到一个可以递归算的式子了。
我们用(S(n,k))表示答案,(p)表示模数((2333)是一个质数),那么有:
egin{aligned}
S(n,k)&=sum_{i=0}^kinom{n}{i} \
&=sum_{i=0}^kinom{nmod p}{i mod p}inom{lfloor frac{n}{p}
floor}{lfloor frac{i}{p}
floor}
end{aligned}
为了接下来方便表示,不妨设(k=k_1p+k_2(k_2<p))
我们按(lfloor frac{i}{p} floor)的值进行分类计算。由于前面有(k_1)块是满的,最后一块不满,所以分两部分计算。
egin{aligned}
S(n,k) &=sum_{i=0}^kinom{nmod p}{i mod p}inom{lfloor frac{n}{p}
floor}{lfloor frac{i}{p}
floor} \
&=sum_{i=0}^{k_1-1}inom{lfloor frac{n}{p}
floor}{i}sum_{j=0}^{p-1}inom{n mod p}{j}+sum_{i=k_1p}^kinom{n mod p}{i mod p}inom{lfloor frac{n}{p}
floor}{lfloor frac{i}{p}
floor} \
&=S(lfloor frac{n}{p}
floor,k_1-1)S(n mod p,p-1)+inom{lfloor frac{n}{p}
floor}{k_1}S(n mod p,k mod p)
end{aligned}
所以预处理(p)以内的组合数以及组合数的前缀和就可以递归算了。组合数用(lucas)算一算就好。