题目链接:卡农

  听说这道题是经典题?

  首先明确一下题意(我在这里纠结了好久):有\(n\)个数,要求你选出\(m\)个不同的子集,使得每个数都出现了偶数次。无先后顺序。

  这道题就是一道数学题。显然我们可以强制有先后顺序,只需要在最后除掉一个\(m!\)即可。令\(f_i\)表示选出\(i\)个子集的方案数,我们来考虑一下怎么算。

  由于总的方案数很好计算,选出\(i\)个子集的方案就是\(A^{i-1}_{2^n-1}\),因为一旦选出了前\(i-1\)个,第\(i\)个就已经确定了。

  我们这样选,可以保证每个数出现了偶数次,但是并不能够保证选出的不是空集以及集合不重复。所以我们来看看不合法的情况有多少。

  第一种情况,如果前\(i-1\)个就是一个合法方案,那么第\(i\)个只能是空集。这种情况显然不合法,方案数是\(f_{i-1}\)。

  第二种情况,第\(i\)个集合和之前任意一个冲突了就不行。由于另外还剩\(i-2\)个集合未确定,所以这部分方案数为\((i-1)f_{i-2}(2^n-1-(i-2))\)。第\(i\)个集合可选的方案数为\(2^n-1-(i-2)\),然后和另外\(i-2\)个一起排列一下还要乘上\(i-1\)。

  所以这道题就做完了。

  下面贴代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
#define maxn 1000010
#define mod 100000007 using namespace std;
typedef long long llg; int n,m,nci;
llg f[maxn],g[maxn],jie; llg mi(llg a,int b){
llg s=1;
while(b){
if(b&1) s=s*a%mod;
a=a*a%mod; b>>=1;
}
return s;
} int main(){
File("a");
scanf("%d %d",&n,&m);
nci=(mi(2,n)-1+mod)%mod; g[0]=jie=1;
for(int i=1;i<=m;i++) g[i]=g[i-1]*(nci-i+1)%mod;
for(int i=1;i<=m;i++) jie*=i,jie%=mod;
for(int i=3;i<=m;i++){
f[i]=g[i-1]-f[i-1];
f[i]-=(i-1)*f[i-2]%mod*(nci-i+2)%mod;
f[i]%=mod; if(f[i]<0) f[i]+=mod;
}
printf("%lld",f[m]*mi(jie,mod-2)%mod);
return 0;
}

BZOJ 2339 【HNOI2011】 卡农的更多相关文章

  1. bzoj 2339: [HNOI2011]卡农

    Description Solution 比较难想.... 我们先考虑去掉无序的这个条件,改为有序,最后除 \(m!\) 即可 设 \(f[i]\) 表示前\(i\)个合法集合的方案数 明确一点: 如 ...

  2. BZOJ.2339.[HNOI2011]卡农(思路 DP 组合 容斥)

    题目链接 \(Description\) 有\(n\)个数,用其中的某些数构成集合,求构造出\(m\)个互不相同且非空的集合(\(m\)个集合无序),并满足每个数总共出现的次数为偶数的方案数. \(S ...

  3. 2339: [HNOI2011]卡农

    Description 首先去除顺序不同算一种的麻烦,就是最后答案除以总片段数\(2^m-1\) 设\(f_i\)表示安排\(i\)个片段的合法种类 那么对于任何一个包含\(i-1\)个片段的序列(除 ...

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

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

  5. [BZOJ2339][HNOI2011]卡农

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

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

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

  7. P3214 [HNOI2011]卡农

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

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

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

  9. [HNOI2011]卡农

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

  10. [HNOI2011]卡农 题解

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

随机推荐

  1. [javascript]编码&i字符串格式化&nput历史记录&清空模态框

    js中编码问题 https://www.haorooms.com/post/js_escape_encodeURIComponent 我在前端js添加时候创建dom时候,有汉字,发现是乱码就研究了下 ...

  2. 怎么获得当前点击的按钮的id名?

    <body> <input id="t1" type="button" value='fff'> <input id=" ...

  3. [LeetCode] 127. Word Ladder _Medium tag: BFS

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...

  4. 混淆和加密.NET开发工具

    .NET开发的工具,可以用ILSpy等很轻松的反编译查看源码,为了保护自己写的软件,一般会对软件进行加密,不仅内部关键数据通过加密,软件开发完毕后,对软件也进行加密,防止别人很轻松的反编译和查看到比较 ...

  5. pythonon ddt数据驱动二(json, yaml 驱动)

    这一篇主要是关于文件的数据驱动. 一.通过json文件驱动 @ddt class MyTest(unittest.TestCase): @file_data('test_data_list.json' ...

  6. selenium webdriver处理HTML5 的视频播放

    import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.sele ...

  7. Promise学习探究

    学习熟知吧,原理还是继续吧 例子1: var isGeted; function getRet(){ return new Promise(function(resolve, reject) { // ...

  8. 76. Minimum Window Substring(hard 双指针)

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  9. transform 和 transition

    transform的属性包括:rotate() / skew() / scale() / translate() /matrix() 其中 rotate() 旋转度数,0-360 skew()  元素 ...

  10. 引入jQuery的src设置

    1.引用在线jQuery 谷歌.微软.百度都有提供在线的jQuery引用.比如 <script src="http://code.jquery.com/jquery-latest.js ...