P3214 [HNOI2011] 卡农

原题

首先我们先简化一下题意。为什么呢?因为这个题如果不简化题意是不太好做的

我们考虑用二进制表示集合,这样题意为:有2n1个数,我们要从中选一个大小为m无序子集,满足以下条件:

  1. 集合中所有数的异或和为0

  2. 集合中元素不可重复

首先无序子集是吓人的,因为我们可以先考虑出有序的情况,再直接/m!即可

对于多种很严格的限制的题,我们要么考虑固定一个限制计算方案数,再减去在这个限定下包含其他限定的不满足条件的;要么考虑所有的方案数,再减去不满足条件的。这题目前我只知道前者的做法。

在这题中,我们如果固定了第2中限制,那第一种限制就很难维护了,因为这些数的值域很大,我们如果想要dp的话不好记录状态。因此我们考虑限制第1个条件

具体的,我们设dpi表示我们已经固定了集合的前i个数,满足两个限制条件的方案数

我们发现如果我们限制第1个条件,有A2n1i1,意思就是说对于前i1个数从[1,2n1]中随便选,然后让第i个数选j=1i1aj即可满足条件……等等,还没有结束。我们发现这样可能会出现第i个位置填0的情况,因此我们还要减去第i个位置填0,及dpi1

然后我们考虑怎么减去第2个条件限制,我们设前i1个数中有一个数ji相同,则剩下i2个数依然满足条件,因此我们要减去dpi2×(i1)×(2n1(i2)),其中2n1(i2)的意思是第i个数和第j个数的可能的值的方案数

因此得到递推式:

dpi=A2n1i1dpi1dpi2×(i1)×(2n1(i2))

最终答案即为dpmm!

posted @   FOX_konata  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示