今天reflash给我出了一道题:
∑∏ki=1xi[xi≥1][∑ki=1xi≤S]modpk,S≤1018,p≤107
我一开始是这样想的:如果
F(x)=∑∞i=0ixi
,那么答案就是
Fk(x)
的前S项系数和,所以我们就得到了一个
O(SlogSlogk)
的fft做法。。。
然后我就想能不能用别的方法做。。但是我发现如果我直接考虑这个式子我似乎只有dp的做法,而dp的话状态数首先就是
O(n2)
的,优化似乎也最多只能用fft了。。因为这个乘法它没法用分配律什么的提出来。
所以考虑模型转化,乘法可以看做是(1+1+1+…)(1+1+1+….)(1+1+1+…)…,所以就相当于是有S个球,我们把要把它们分成k份,再在每一份中选一个球。所以我们从左往右考虑,就相当于是要选一个球,再选一个球作为边界,再选一个球,再选一个边界。。但是问题在于,每一份中选的那个球和边界可以是同一个球。
所以我就不会做了。
然后听了reflash的讲解,感觉非常非常神奇!原来可以为每个边界单独开一个球, 就相当于是在S+k个球中选2k个球,然后从小到大排序把第偶数个球实际上是它左边的球,这样答案就是
C2kS+k
!
所以不妨再来看那个经典问题:在n个不同元素中有重复取k个的方案数。原来学的都是插板法,但是这样的话就可以得到一种更简单的解释了!对于每一种方案,我们选的元素编号更大的k-1个新建一个球;那么每一种在n+k-1个球中选k的方案,我们如果把后k-1个看成0,其他的n个看成1,那么选的这k个就等价于在选它或它左边第一个1,所以就与在n个元素中有重复取k个的方案一一对应。
广义地看这个问题,就是一个序列 {xn},xi∈[1,S],∀i∈[1,n],xi−xi−1≥0,∀i∈(1,n] ,其中有n-m个数要求 [i=1]∪[xi−xi−1>0] ,那么答案就是 CnS+m 。