容斥+计数的练习(长期更新)

菜就多练。

朴素的容斥原理应用

I.P1450 [HAOI2008] 硬币购物

Q:

共有 4 种硬币。面值分别为 c1,c2,c3,c4

某人去商店买东西,去了 n 次,对于每次购买,他带了 dii 种硬币,想购买 s 的价值的东西。请问每次有多少种付款方法。

1s,di,ci105,1n1000

Sol:

找到限制:硬币的数量di

考虑没有限制的情况:就是完全背包。

那么对硬币的数量套容斥原理,钦定有i种硬币的数量不符合限制,其他硬币随便(做完全背包)。那么将钦定的部分从s中减去,剩下的部分就是完全背包。然后对这个东西上容斥系数,那么就是和钦定的种数i相关,为(1)i

完全背包部分可以在多测前预处理,于是一次询问中只有对4种硬币容斥算贡献的复杂度,显然可以接受。

II.P5505 [JSOI2011] 分特产

Q:

n个有标号盒子和m种有标号球,第k种球有sk个(这之中无标号),每个盒子中至少放一个球。问方案数。

Sol:

找到限制是“每个盒子中至少放一个球”。

考虑没有限制的情况,对于每种球来说,就是无标号球放到有标号盒子中,盒子可以为空,直接插板法。对于每种球就直接乘起来(因为分步在做)。

于是对这个限制进行容斥。设当前钦定有k个盒子为空,其他任意,这个方案数为fk。那么套上容斥系数,ans=k(1)kfk

如何证明这个容斥是对的?

考虑一种有k个盒子为空的方案,我们希望它被计数[k=0]次。考虑它在哪些地方被计数了。对于钦定有i个盒子为空的情况,它被计数了(1)i(ni)(niki)次。

那么对i求和,就可以得到它被计数的次数:

i(1)i(ni)(niki)=i(1)i(nk)(ki)=(nk)i(1)i(ki)=(nk)[k=0]

k=0时,(nk)=1。所以这个方案被计数了[k=0]次,是正确的。

回归主线,如何求fi

根据定义,首先选出i个盒子钦定为空,这是(ni)。然后对于任意一种小球k,放入可以为空的其余ni个盒子中,那么就是(sk+ni1ni1)。这是分步的,那么对于所有种类的小球,贡献为k(sk+ni1ni1)

所以fi=(ni)k(sk+ni1ni1)

于是就可以求了。

计数DP

练好DP就好了,所以去DP吧。

posted @   RandomShuffle  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示