1 条题解
-
0
自动搬运
来自洛谷,原作者为

kbtyyds
恶臭骐羽搬运于
2025-08-24 22:43:57,当前版本为作者最后更新于2023-01-28 10:58:34,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
P8941 题解
建议在博客里食用:
题目描述
给定 ,求有多少有序 元组 满足
-
,。
-
,。
-
,。
(此处分别记为约束 1,2,3)
答案对 取模。
前置知识:
bitset,不会的可以参考这个。
1. 预处理
我们先定义 个长度为 的 bitset,记为
bitset < Size > b[Size];接着,枚举 ,并让
再记:
$$f[i]=\sum_{j=1}^n[\operatorname{popcount}(i\oplus j)=k]=b[i].\operatorname{count}() $$$$g[i][j]=\sum_{l=1}^n[\operatorname{popcount}(i\oplus l)=k][\operatorname{popcount}(j\oplus l)=k]=(b[i]\&b[j]).\operatorname{count}() $$此处复杂度为 ,稍后会讲这两个数组的用途。
2. 计算
看题目数据范围的 可以知道我们要对 分类讨论!
显然,约束 2,3 在只有一个数的情况下没有用。因此只需考虑约束 1 的值域约束。
显然 。
我们可以枚举 ,那么前文提到的 就是 的合法数量。
所以
类似于 ,我们可以枚举 ,那么 的可行方案数为 , 的可行方案数为 。(因为题目规定 ,因此要减去 )
由乘法原理知
说实话我不知道为什么联想到了 CSP-S 2022 T1。考虑枚举 ,由约束 2 知只有当 为 时,才有符合的 元组。
那么 的合法数量为 (因为 ), 的合法数量为 (因为 )
但是,我们多算了 的情况,因此要减去(即 )。
易得 $ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^n[b[i][j]=1]((f[i]-1)(f[j]-1)-(g[i][j]))$
类似的思路,枚举 (首先要保证 ),那么 的合法数量为
接下来分两种情况讨论:
- 。此时 的合法数量为 (除去 ), 的合法数量为 (除去 )。
- 。此时 的合法数量为 (除去 ), 的合法数量为 (除去 )。
当然,不要忘记舍去 的情况。由于 已经占了一个 的位置,因此 的数量为
那么 $ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^n [i\ne j]\begin{cases}g[i][j](f[i]-2)(f[j]-2)-(g[i][j]-1)& b[i][j]=1\\g[i][j](f[i]-1)(f[j]-1)-(g[i][j]-1)&b[i][j]=0\end{cases}$
代码
可以直接根据上方公式计算,于是代码放云剪切板。
时间复杂度 ,空间复杂度 ,可以通过本题(而且跑的飞快)。
-
- 1
信息
- ID
- 8210
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者