感觉不是很麻烦,可能就组合排列转化绕一点。。。

抽象化题意

给定 \(n\) 个元素,从中选出 \(m\) 个集合,要求:

  1. 集合不为空,集合里不能有相同的元素

  2. \(m\) 个集合都互不相同

  3. 所有元素被选出的次数为偶数

求方案数,并对 \(100000007\) 取模

凭感觉是DP+组合数

设 \(dp[i][0/1]\) 表示当前选了 \(i\) 个集合合法还是不合法的方案数,但是转移不好转移,因为我们并不知道哪些集合非法,所以我们不能将非法当成状态,只能把他放到转移里,怎么转移?考虑容斥。

若先满足第三个条件,那么就是 \(A^{i-1}_{2^n-1}\) ,因为取决奇偶的只会是最后一个,所以前面 \(i-1\) 任取。

还有两个条件,第一个条件怎么搞?“不能有相同元素”我们已经在第三个条件考虑过了,那我们先强制集合为空,所贡献的就是 \(dp[i-1]\) 种方案,所以减掉 \(dp[i-1]\) 。

最后一个,第二个条件怎么处理?容斥,当前考虑第 \(i\) 个集合,需要和前 \(i-1\) 个集合任意一个相同,且当前 \(i\) 集合的取法有 \(2^n-1-(i-2)\) 种,剩余 \(i-2\) 个集合是合法的,就是 \((i-1)(2^n-i+1)dp[i-2]\) 种

转移方程就是 \(dp[i]=A^{i-1}_{2^n-1}-dp[i-1]-(i-1)(2^n-i+1)dp[i-2]\) ,因为我们算得是排列,所以最后要除以 \(m!\) ,当然转移的时候也可以转成组合,就不需要除以 \(m!\) 了

#include<bits/stdc++.h>

#define int long long

#define maxn 2000005

const int mod=1e8+7;

using namespace std;

template<class T>

inline T read(){
T r=0,f=0;
char c;
while(!isdigit(c=getchar()))f|=(r=='-');
while(isdigit(c))r=(r*10)+(c^48),c=getchar();
return f?-r:r;
} int n,m; int dp[maxn],pow2,A[maxn]; inline int mypow(int a,int b){
int ret=1;
while(b){
if(b&1)ret=(ret*a)%mod;
a=(a*a)%mod,b>>=1;
}
return ret;
} signed main(){
n=read<int>();
m=read<int>();
if(n==1&&m==1){puts("1");return 0;}
pow2=mypow(2,n);
A[1]=pow2-1;
int tmp=pow2-1,facm=1;
for(int i=2;i<=m;i++)
A[i]=A[i-1]*(--tmp)%mod,facm=facm*i%mod;
dp[1]=0,dp[0]=1;
for(int i=2;i<=m;i++){
dp[i]=((A[i-1]-dp[i-1]+mod)%mod-(i-1)*(pow2-i+1)%mod*dp[i-2]%mod+mod)%mod; //pow2[n]-1-(i-2)
}
// for(int i=1;i<=m;i++)cout<<dp[i]<<endl;
printf("%lld\n",dp[m]*mypow(facm,mod-2)%mod);
return 0;
}

P3214 [HNOI2011] 卡农 题解的更多相关文章

  1. P3214 [HNOI2011]卡农

    题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...

  2. [HNOI2011]卡农 题解

    题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...

  3. 洛谷 P3214 - [HNOI2011]卡农(线性 dp)

    洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于 ...

  4. 【BZOJ2339】[HNOI2011]卡农 组合数+容斥

    [BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...

  5. [BZOJ2339][HNOI2011]卡农

    [BZOJ2339][HNOI2011]卡农 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见& ...

  6. bzoj2339[HNOI2011]卡农 dp+容斥

    2339: [HNOI2011]卡农 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 842  Solved: 510[Submit][Status][ ...

  7. BZOJ2339[HNOI2011]卡农——递推+组合数

    题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...

  8. [HNOI2011]卡农 (数论计数,DP)

    题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...

  9. [HNOI2011]卡农

    题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...

  10. 【bzoj2339】[HNOI2011]卡农 dp+容斥原理

    题目描述 题解 dp+容斥原理 先考虑有序数列的个数,然后除以$m!$即为集合的个数. 设$f[i]$表示选出$i$个集合作为满足条件的有序数列的方案数. 直接求$f[i]$较为困难,考虑容斥,满足条 ...

随机推荐

  1. 【Shell】数组

    数组 bash 只支持一维数组. 数组下标从 0 开始,下标可以是整数或算术表达式,其值应大于或等于 0. 创建数组 # 创建数组的不同方式 nums=([2]=2 [0]=0 [1]=1) colo ...

  2. Oracle快速拷贝数据

    游标拷贝数据 根据条件进行数据拷贝 -- 游标方式拷贝数据 DECLARE CURSOR cur IS SELECT * FROM JACKPOT WHERE TO_CHAR(JACKPOT.CREA ...

  3. 【WebGL系列-04】清除缓冲区并绘制图形

    清除缓冲区并绘制图形 前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理. 清除缓冲区 由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜 ...

  4. 关于quartus II的导入以前的工程,QSF文件出现的错误的解决方案。

    在有时候打开以前的工程,或者别人做好的例程会遇到一些报错信息.具体报错信息如下: 报错信息语句行: 在文件QSF文件中有几行出错,显示错误读取,即不能打开工程.打开文件发现该几行的PIN 使能信号处于 ...

  5. TypeScript:接口

    介绍 TypeScript的核心原则之一是对值所有的结构类型进行类型检查.在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义约束. 接口的基本使用 interface ...

  6. 从原理聊JVM(四):JVM中的方法调用原理

    1 引言 多态是Java语言极为重要的一个特性,可以说是Java语言动态性的根本,那么线程执行一个方法时到底在内存中经历了什么,JVM又是如何确定方法执行版本的呢? 2 栈帧 JVM中由栈帧存储方法的 ...

  7. [shell]在curl测试的data参数中引用变量

    在curl测试的data参数中引用变量 前言 在使用curl接口进行接口传参时,常会使用如下方法: #!/bin/bash url="http://192.168.0.10:8000/api ...

  8. 【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

    一.前言 前几天发生了一个故事,发生了这样一个情景:一位新加入的同事刚刚入职不久,领取了一台崭新的电脑.随后,他投身于一个新项目,但却遇到了一个困扰:由于这台电脑没有管理员权限,他无法在上面安装所需的 ...

  9. Java stream 流

    Java stream 流 中间操作 1.filter 作用:将流中的元素,基于自定义的比较器进行去重 方法定义 Stream<T> filter(Predicate<? super ...

  10. 重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

    在 Hugging Face,我们一直致力于提升服务安全性,因此,我们将对通过 Git 与 Hugging Face Hub 交互时的认证方式进行更改.从 2023 年 10 月 1 日 开始,我们将 ...