WC模拟:Every one will meet some difficult(第一,第二类斯特林数+n阶差分)

博客介绍了如何使用第一、第二类斯特林数结合n阶差分解决一道数学问题,涉及国家集训队作业中的复杂计算。通过变换公式、组合数展开和动态规划方法求解特定集合数。

题意:
给定n,m,s,t求出满足:

i=1mxis

im,xi>0

in,xit

的解的个数。
(mn1000,m1e9,t1e5,nts1e18)

题解:

这好像是国家集训队的作业,反正我不会做。。。

有几个知识点怕忘记写一篇博客来记一下。

首先比较显然的是可以枚举前n个中的非法个数然后容斥,得到:

ans=i=0n(1)i(ni)(stim)

fi=(stim),则

ans=i=0n(1)i(ni)fi

这个式子其实是n阶前项差分公式稍微变一下形,那么考虑前向差分这个f
利用n阶差分公式:

Δn[f](x)=i=0n(1)ni(ni)f(x+i)

这个式子可以通过归纳法证明,这里略过。
得到:

(1)nans=i=0n(1)ni(ni)f(i)

发现其实就是求
Δn[f](0)

一般函数的n阶差分不是很好求,但是多项式有一种组合数的表达方式:

对于m阶函数f(x),必然唯一对应一种表达方式

f(x)=i=0m(xi)bi

而对于这样的函数的n阶差分,有:

Δn[f](x)=i=0m(xin)bi

这个式子同样可以归纳证明,具体略。

那么当前答案为bn

考虑如何将f转化为组合数形式。
观察f(x)的式子:

f(x)=(stxm)

1.用第一类斯特林数将组合数展开(拆开的原因是现在的组合数很奇怪,要想办法消掉)。

xn=i=0n(1)ni[ni]xi

f(x)=====(stxm)1m!(stx)m1m!i=0m(1)mi[mi](stx)i1m!i=0m(1)mi[mi]j=0i(1)jtjxjsij(ij)1m!j=0mxji=jm(1)mi+j[mi]tjsij(ij)

2.用第二类斯特林数转化为组合数形式。

xn=i=0n{ni}xi

不妨设

aj=1m!i=jm(1)mi+j[mi]tjsij(ij)

那么:

f(x)=j=0mxjaj

现在这个形式已经是很显然的让你用第二类斯特林转为下降幂形式,然后变为组合数了。
f(x)===j=0mxjajj=0maji=0j{ji}(xi)i!i=0m(xi)i!j=imaj{ji}

bnn!j=nmaj{jn}
带入a后可以得到:

bn=i=nmn!m!{in}j=im(1)mj+i[mi]sijtj(ij)

然后这里可以(mn)2枚举了,关键是求{in}[mi]

注意到n,m非常大,但是上下两项的差距却很小,即是大小大于等于2的集合个数很小,考虑从组合意义上来DP出这个斯特林数。
f[i][j]表示i个物品放到j个大于等于2的集合的个数,g[i][j]表示i个物品放到j个大于等于2的环排列的个数,可以通过枚举大小大等于2的集合数来求出两类数,即为:

{in}=j=0min{in,n}(inj)f[in+j][j]

另外一个同理。 下面考虑如何DPf,g,其实同斯特林数一样,只需要考虑是加入以前的集合还是新建一个集合就好了:

f[i][j]=f[i1][j]j+f[i2][j1](i1)g[i][j]=g[i1][j](i1)+g[i2][j1](i1)

然后这道题就做完了,我的代码忘记保存了所以看到这篇题解的人还是自已码吧。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值