Luogu3214 HNOI2011 卡农 组合、DP
火题qwq
我们需要求的是满足元素个数为\(M\)、元素取值范围为\([1,2^n-1]\)、元素异或和为\(0\)的集合的数量。
首先我们可以计算元素有序的方案数(即计算满足这些条件的序列的数量),然后除以\(M!\)。
设\(dp_i\)表示大小为\(i\)的满足条件的序列个数
由"元素异或和为\(0\)"可以知道,如果确定了其中\(i-1\)个向量,第\(i\)个向量就可以知道了,选择\(i-1\)个向量的方案数是\(A_{2^n-1}^{i-1}\)
然后考虑非法情况:当前元素为\(0\)时,前\(i-1\)个向量异或和为\(0\),所以要减掉\(dp_{i-1}\);存在两个向量相同时,其他的向量的异或和就为\(0\),因为选择这个向量的方案数是\(i-1\),选择这两个向量的取值的方案数是\(2^n-1-(i-2)\),所以这里需要减掉\(dp_{i-2} \times (i-1) \times (2^n-1-(i-2))\)
那么DP方程就是\(dp_i = A_{2^n-1}^{i-1} - dp_{i-1} - dp_{i-2} \times (i-1) \times (2^n-1-(i-2))\)。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<cassert>
//This code is written by Itst
using namespace std;
const int MOD = 1e8 + 7;
int dp[1000003] , N , M;
int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
cin >> N >> M;
int down = 1 , tms = 1 , tmp = 1 , jc = 1;
for(int i = 1 ; i <= N ; ++i)
down = (down << 1) % MOD;
--down; tms = tmp = down;
dp[0] = 1; dp[1] = 0;
for(int i = 2 ; i <= M ; ++i){
jc = 1ll * jc * i % MOD;
dp[i] = (2ll * MOD + tms - dp[i - 1] - 1ll * dp[i - 2] * (i - 1) % MOD * (tmp - i + 2) % MOD) % MOD;
tms = 1ll * tms * (--down) % MOD;
}
cout << 1ll * dp[M] * poww(jc , MOD - 2) % MOD;
return 0;
}
Luogu3214 HNOI2011 卡农 组合、DP的更多相关文章
- BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)
题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...
- bzoj2339[HNOI2011]卡农 dp+容斥
2339: [HNOI2011]卡农 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 842 Solved: 510[Submit][Status][ ...
- P3214 [HNOI2011]卡农
题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- [BZOJ2339][HNOI2011]卡农
[BZOJ2339][HNOI2011]卡农 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见& ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
- [HNOI2011]卡农 题解
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
随机推荐
- 定量变量和定性变量的转换(Transform of Quantitative & Qualitative Variables)
定量变量(Quantitative Variables):也称为数值型变量(Numerical Variables),可以用连续值或离散值表示.比如:气温(连续值),学生人数(离散值). 为什么要对定 ...
- HDU 1542.Atlantis-线段树求矩形面积并(离散化、扫描线/线段树)-贴模板
好久没写过博客了,这学期不是很有热情去写博客,写过的题也懒得写题解.现在来水一水博客,写一下若干年前的题目的题解. Atlantis Time Limit: 2000/1000 MS (Java/Ot ...
- git:GitLab代码回滚到特定版本
在当前branch上多次commit代码并且push后,发现不符合要求,需要回滚到特定的版本.步骤如下: 1.查找commitId (1)用命令行打开git项目路径,输入git log命令查看comm ...
- GoCN每日新闻(2019-10-26)
GoCN每日新闻(2019-10-26) 1. GateKeeper:滴滴开源的使用Go编写的不依赖分布式数据库的API网关 https://mp.weixin.qq.com/s/gpQSPJ-uRp ...
- P2052 [NOI2011]道路修建——树形结构(水题,大佬勿进)
P2052 [NOI2011]道路修建 这个题其实在dfs里面就可以把事干完的,(我一开始还拿出来求了一把)…… 一条边的贡献就是儿子的大小和n-siz[v]乘上边权: #include<cma ...
- 大量数据通过Phoenix插入到hbase报错记录(2)
错误: Caused by: java.sql.SQLException: ERROR (INT10): Unable to find cached index metadata 解决办法: 在hba ...
- PHP 根据php传的值修改 select 中动态生成的 option 组的默认选中值
有一个情况今天遇到了:通过后台传过来的一组下拉框的option值,需要默认选中其中某一项. html 部分是这样的: <select class="form-control" ...
- dockerfile文件语法命令
dockerfile文件语法命令 (1) FROM命令,支持两种形式,构建新镜像使用的基础镜像,所以源镜像必须存在,并且是非注释的第一条命令. DOCKERFILEFORM <image> ...
- MYSQL事务的开启与提交
MYSQL 事务处理主要有两种方法: 1.用 BEGIN, ROLLBACK, COMMIT来实现 BEGIN 开始一个事务 ROLLBACK 事务回滚 COMMIT 事务确认 2.直接用 SET 来 ...
- C# HtmlDecode、HtmlEncode、UrlEncode、UrlDecode
不用System.Web 对 Content进行编码,De编码 string content = "<br/>"; string s1 = WebUtility.Htm ...