loj 6077/bzoj 2431

首先我们考虑一个暴力的dp:

我们从小到大加入每个数,当我们加入第$i$个数时,可能产生的逆序对数量是$[0,i-1]$(这个证明考虑把第$i$个数放在哪即可),这样可以列出一个递推式:

设状态$dp[i][j]$表示已经加到了第$i$个数,此时的逆序对个数为$j$,那么有转移:$dp[i][j]=\sum_{k=j-i+1}^{j}dp[i-1][k]$

这个转移的时间复杂度是$O(n^{3})$

然后考虑优化,显然那个求和式可以用前缀和优化,时间复杂度降成$O(n^{2})$

这样已经可以通过bzoj上的题目了,但loj上的是加强版,过不去

考虑其他做法:

(如果您不喜欢多项式可以直接跳到解法2)

首先,考虑生成函数:对每个位置构造一个生成函数,那么最后的结论就是:

$F(x)=\prod_{i=0}^{n-1}(\sum_{j=0}^{i}x^{j})$

整理一下后面,就是:

$F(x)=\prod_{i=0}^{n-1}\frac{1-x^{i+1}}{1-x}$

然后整体合并一下,就得到:

$F(x)=\frac{\prod_{i=1}^{n}(1-x^{i})}{(1-x)^{n}}$

有点奇怪,两边取下对数:

$lnF(x)=\sum_{i=1}^{n}ln(1-x^{i})-nln(1-x)$

$ln(1-x^{i})$这个东西已经展开过很多次了...

对$ln(1-x^{i})$求导得到:

$\frac{-ix^{i-1}}{1-x^{i}}$

把下半部分恢复成等比数列求和的形式:

$-ix^{i-1}\sum_{j=0}^{∞}x^{ij}$

把外面的系数移进去:

$-\sum_{j=0}^{∞}ix^{ij+(i-1)}$

然后积分:

$\int -\sum_{j=0}^{∞}ix^{ij+(i-1)}=-\sum_{j=1}^{∞}\frac{i}{ij+i}x^{ij+i}$

约分一下,就得到了:

$-\sum_{j=0}^{∞}\frac{1}{j+1}x^{ij+i}$

令$j=j+1$,有:

$-\sum_{j=1}^{∞}\frac{1}{j}x^{ij}$

对一个函数先求导再积分得到的就是原函数,因此有:

$ln(1-x^{i})=-\sum_{j=1}^{∞}\frac{1}{j}x^{ij}$

这样的话可以通过枚举倍数做到$O(nlnn)$(即调和级数)求出系数,然后多项式exp即可,注意这里由于模数不好,需要用到MTT,总时间复杂度仍为$O(nlog_{2}n)$

其实后面的部分基本与这道题一致,基本步骤也相同

但是...由于过于毒瘤,我并不想写一遍...

(更何况还多了一大堆东西)

因此我们考虑做法二

原来的dp已经被压榨到足够优秀,剩下的部分很困难了,因此我们考虑转化问题:

回到最开始的思想:

我们从小到大加入每个数,当我们加入第$i$个数时,可能产生的逆序对数量是$[0,i-1]$

那么,如果我们设$x_{i}$表示加入第$i$个数时产生的逆序对数量,我们实际只是在解这个不定方程:

$\sum_{i=1}^{n}x_{i}=k$

其中对任意$i\in [1,n]$,有$x_{i}\in [0,i-1]$

我们实际是在求这个不定方程解的组数!

每个变量都有上界,这很不好求...

因此我们考虑容斥,容斥系数-1

还是要容斥的...

我们不妨假设有某个位置不合法,设这个位置为$p$,那么显然有表达式:

$x_{p}\geq p-1$

那么我们考虑一个增量$\delta_{p}=x_{p}-p+1$,那么我们在等式两侧同时去掉这个增量,新的变量记作$x_{p}^{'}$,转化后的方程即为:

$x_{1}+x_{2}+...+x_{p}^{'}+...+x_{n}=k-\delta_{p}$

然而,在这种情况下,我们事实上仍然无法保证剩下的位置均合法,因此这样统计出的是至少有一个不合法的个数!

据此,我们进一步分析:如果我们先统计出总的增量$\delta$,然后将这个增量分配

猜你喜欢

转载自www.cnblogs.com/zhangleo/p/11135016.html