二项式反演:
[f(n)=sum _ {i=0}^n (-1)^i inom n i g(i) Leftrightarrow g(n)=sum _ {i=0} ^n (-1)^i inom n i f(i)
]
这个式子可以通过集合相关知识得到(容斥)
然后令:(h(n)=(-1)^ng(n))
那么有
[f(n)=sum_{i=0}^n inom n i h(i) Leftrightarrow frac{h(n)}{(-1)^n}=sum_{i=0}^n inom n i f(i)
]
然后把式子整理一下,得到第二种表示二项式定理的形式
[f(n)=sum_{i=0}^n inom n i g(i) Leftrightarrow g(n)=sum_{i=0}^n inom n i f(i)
]
直接带入推导并且交换枚举顺序可以得到:
[f(n)=sum_{j=0} ^n f(j)sum _ {i=j} ^n (-1)^{i-j} inom n i inom i j
]
后面的组合数:(inom n i inom i j) 考虑其组合意义,从 (n) 个里面选 (i) 个再从 (i) 个里面选 (j) 个用组合阶乘式子能给推成(inom n jinom {n-j}{i-j})
然后再改变枚举顺序,平移一下循环变量
[f(n)=sum_{j=0} ^n inom n j f(j) sum _ {t=0} ^{n-j} (-1)^t inom {n-j} t
]
在后面乘上 (1) 的对应次方,用二项式定理转一步
[f(n)=sum_{i=0} ^n inom n i f(i) (1-1)^{n-j}
]
显然得证(只有(i=n)时那个 ((1-1)^{n-j}) 不为 (0))
还有一种相对常见的式子,因为题目中大多会表述为恰好选几个,然后我们用多步容斥(或二项式反演)就会方便求解
[f(n)=sum_{i=n}^m inom i n g(i)Leftrightarrow g(n)=sum_{i=n}^m (-1) ^{i-n} inom i n f(i)
]
相关证明和上面的类似
例题
已经没有什么好害怕的了
我们设 (g) 为正确答案,(f) 为至少 (k) 个答案
设 (dp_{i,j}) 为前 (i) 个选 (j) 个 (A) 中比 (B) 中大的
先看是不是要配对,不要那就是 (f_{i,j}+=f_{i-1,j})
再看如果配对的话,那就是 (f_{i,j}=f_{i-1,j-1}+(larger(i)-j+1))
(larger(i)) 表示 (A_{i}) 大于几个 (B_i),可以用暴力或者单调栈做掉……
(f_x=dp_{n,x} imes(n-x)!)
这里上个反演就做完了
[g_i=sum_{i=k}^n (-1)^{i-k} inom i k imes dp_{n,i} imes (n-i)!
]