「2017 山东一轮集训 Day7」逆序对
题解:
满满的套路题。。
首先显然从大到小枚举
然后每次生成的逆序对是1----(i-1)的
这样做dp是nk的 复杂度太高了
那我们转化一下问题
变成sigma(ai (ai<i) )=k的方案数
据说是个经典问题。。感觉非常奇妙
先容斥一下,也就是说 总的-至少1个条件不满足+至少2个条件不满足
那考虑一下如何算有x个条件不满足
不满足这个条件就可以等价成ai>=i
那么可以先将ai-i 那么就变成所有数的定义域都变成了自然数 那么方案数就是组合数了
显然我们可以把x个条件-i的和相等的算在一起
令f[i][j]表示在(0,1,2...n)中选i个数和为j的方案数
其实在这里也就是 i个条件和为j
那么这样答案就是先枚举i
ans1=枚举j,f[i][j]*C();
总ans=ans1*(-1)^i
最后的问题就是如何计算f[i][j]
第一次看见这种思路好像是上次zjoi讲课(这是生成不重复集合的经典做法)
由于要保证这些自然数是不同的
所以决策有两种
1。将n-1个数先加1(保证不同)再插入一个1
2。将这n个数都加1
另外由于加的数有可能大于n,所以要减掉f[i-1][j-n-1] (因为这一次填入的一定是n+1,并且所有方案都有)
g