题意:
给定n,m,s,t求出满足:
∑i=1mxi≤s
∀i≤m,xi>0
∀i≤n,xi≤t
的解的个数。
(m−n≤1000,m≤1e9,t≤1e5,nt≤s≤1e18)
题解:
这好像是国家集训队的作业,反正我不会做。。。
有几个知识点怕忘记写一篇博客来记一下。
首先比较显然的是可以枚举前n个中的非法个数然后容斥,得到:
设fi=(s−tim),则
ans=∑i=0n(−1)i(ni)fi
这个式子其实是n阶前项差分公式稍微变一下形,那么考虑前向差分这个
利用n阶差分公式:
这个式子可以通过归纳法证明,这里略过。
得到:
(−1)nans=∑i=0n(−1)n−i(ni)f(i)
发现其实就是求
Δn[f](0)
一般函数的n阶差分不是很好求,但是多项式有一种组合数的表达方式:
对于
m 阶函数f(x),必然唯一对应一种表达方式f(x)=∑i=0m(xi)bi而对于这样的函数的n阶差分,有:
Δn[f](x)=∑i=0m(xi−n)bi 这个式子同样可以归纳证明,具体略。
那么当前答案为bn
考虑如何将f转化为组合数形式。
观察f(x) 的式子:
f(x)=(s−txm)1.用第一类斯特林数将组合数展开(拆开的原因是现在的组合数很奇怪,要想办法消掉)。
xn−=∑i=0n(−1)n−i[ni]xif(x)=====(s−txm)1m!(s−tx)m−1m!∑i=0m(−1)m−i[mi](s−tx)i1m!∑i=0m(−1)m−i[mi]∑j=0i(−1)jtjxjsi−j(ij)1m!∑j=0mxj∑i=jm(−1)m−i+j[mi]tjsi−j(ij)2.用第二类斯特林数转化为组合数形式。
xn=∑i=0n{ni}xi−不妨设
aj=1m!∑i=jm(−1)m−i+j[mi]tjsi−j(ij)那么:
f(x)=∑j=0mxjaj
现在这个形式已经是很显然的让你用第二类斯特林转为下降幂形式,然后变为组合数了。
f(x)===∑j=0mxjaj∑j=0maj∑i=0j{ji}(xi)i!∑i=0m(xi)i!∑j=imaj{ji}bn为n!∑j=nmaj{jn}
带入a后可以得到:
bn=∑i=nmn!m!{in}∑j=im(−1)m−j+i[mi]si−jtj(ij) 然后这里可以(m−n)2枚举了,关键是求{in}和[mi]
注意到n,m非常大,但是上下两项的差距却很小,即是大小大于等于2的集合个数很小,考虑从组合意义上来DP出这个斯特林数。
设f[i][j]表示i个物品放到j 个大于等于2的集合的个数,g[i][j]表示i个物品放到j 个大于等于2的环排列的个数,可以通过枚举大小大等于2的集合数来求出两类数,即为:
{in}=∑j=0min{i−n,n}(in−j)f[i−n+j][j]另外一个同理。 下面考虑如何DP出f,g,其实同斯特林数一样,只需要考虑是加入以前的集合还是新建一个集合就好了:
f[i][j]=f[i−1][j]∗j+f[i−2][j−1]∗(i−1)g[i][j]=g[i−1][j]∗(i−1)+g[i−2][j−1]∗(i−1)然后这道题就做完了,我的代码忘记保存了所以看到这篇题解的人还是自已码吧。。