[HNOI2011]卡农 题解
题目描述
众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则。他将声音分成 n 个音阶,并将音乐分成若干个片段。音乐的每个片段都是由 1 到 n 个音阶构成的和声,即从 n 个音阶中挑选若干个音阶同时演奏出来。为了强调与卡农的不同,他规定任意两个片段所包含的音阶集合都不同。同时为了保持音乐的规律性,他还规定在一段音乐中每个音阶被奏响的次数为偶数。现在的问题是:小余想知道包含 m 个片段的音乐一共有多少种。两段音乐 a 和 b 同种当且仅当将 a 的片段重新排列后可以得到 b。例如:假设 a
为{{1,2},{2,3}},b 为{{3,2},{2,1}},那么 a 与 b 就是同种音乐。由于种数很多,你只需要
输出答案模 100000007(质数)的结果。
输入格式
从文件input.txt中读入数据,输入文件仅一行,具体是用空格隔开的两个正整数n和m,分别表示音阶的数量和音乐中的片段数。20%的数据满足n,m≤5,50%的数据满足n,m≤3000,100%
的数据满足n,m≤1000000。
输出格式
输出文件 output.txt 仅包含一个非负整数,表示音乐的种数模 100000007 的结果。
很强的容斥题。
首先将题意化简一下:从集合$S={1,2,3,...,n}$中选出$m$个子集,满足非空且选出的子集不能相同并保证${1,2,3...n}$每个元素出现次数为偶数。
题目里给出的同种音乐的定义很令人烦躁,所以我们化无序为有序,先使用排列数计算,算出最后结果再除以$m!$(当然直接用组合也可以?)。
然后考虑转移。定义$f[i]$为转移到第$i$个子集,满足所有条件的方案数。如果前$i-1$个子集已经确定,那么根据每个元素出现次数为偶数这条性质,我们就可以确定第$i$个子集(只能选前$i-1$个里出现奇数次的元素)。总的方案数为$A_{2^n-1}^{i-1}$。
这里面包括了许多不满足非空和不相同这两个条件的集合。考虑容斥掉,如果第$i$个子集为空,那么前$i-1$个子集也是一个合法的方案。所以这部分方案数为$f[i-1]$。
还需要去掉存在相同子集的情况。如果第$i$个子集和第$j$个子集重复,那么去掉第$i$个和第$j$个,剩下$i-2$个也是合法方案,数量为$f[i-2]$。此时第$i$个子集有$2^n-1-(i-2)$种方案,和$i$相同的那个子集的位置有$i-1$个,所以这部分的方案数为$f[i-2]\times (i-1)\times (2^n-1-(i-2))$。
$f[i]=A_{2^n-1}^{i-1}-f[i-1]-f[i-2]\times (i-1)\times (2^n-1-(i-2))$
初始化$f[0]=1$。
//实名diss某川 明明当年做题的时候跟我说了题解 还不上去讲
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
#define re register
const int mod=1e8+,N=;
ll f[N],fac,a[N],side,n,m;
ll qpow(ll x,ll y)
{
ll res=;
while(y)
{
if(y&)res=res*x%mod;
x=x*x%mod;
y>>=;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>n>>m;
fac=a[]=f[]=;
for(re int i=;i<=m;i++)fac=fac*i%mod;
fac=qpow(fac,mod-);
side=qpow(,n)-;
for(re int i=;i<=m;i++)a[i]=a[i-]*(side-i+)%mod;
for(re int i=;i<=m;i++)
{
f[i]=a[i-]-f[i-];
f[i]-=(f[i-]*(i-)%mod*(side-i+))%mod;
f[i]=(f[i]%mod+mod)%mod;
}
cout<<f[m]*fac%mod<<endl;
return ;
}
[HNOI2011]卡农 题解的更多相关文章
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- [BZOJ2339][HNOI2011]卡农
[BZOJ2339][HNOI2011]卡农 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见& ...
- bzoj2339[HNOI2011]卡农 dp+容斥
2339: [HNOI2011]卡农 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 842 Solved: 510[Submit][Status][ ...
- BZOJ2339[HNOI2011]卡农——递推+组合数
题目链接: [HNOI2011]卡农 题目要求从$S=\{1,2,3……n\}$中选出$m$个子集满足以下三个条件: 1.不能选空集 2.不能选相同的两个子集 3.每种元素出现次数必须为偶数次 我们考 ...
- P3214 [HNOI2011]卡农
题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- 【bzoj2339】[HNOI2011]卡农 dp+容斥原理
题目描述 题解 dp+容斥原理 先考虑有序数列的个数,然后除以$m!$即为集合的个数. 设$f[i]$表示选出$i$个集合作为满足条件的有序数列的方案数. 直接求$f[i]$较为困难,考虑容斥,满足条 ...
- bzoj 2339: [HNOI2011]卡农
Description Solution 比较难想.... 我们先考虑去掉无序的这个条件,改为有序,最后除 \(m!\) 即可 设 \(f[i]\) 表示前\(i\)个合法集合的方案数 明确一点: 如 ...
随机推荐
- jdbc blob插入及查询操作
首先建一张表 create table picture( picId ) primary key not null, picName ) not null, picfile image null ) ...
- AcWing 209. 装备购买 (高斯消元线性空间)打卡
脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量z[i]=(ai,1,ai,2,..,ai,m)z[i]=(ai,1,ai,2,..,ai,m) 表示,每个装备需要 ...
- HTML CSS + DIV实现排版布局
HTML CSS + DIV实现排版布局 1.网页可以看成是由一个一个"盒子"组成,如图: 由上图可以看出,页面分为上(网站导航).中.下(版权声明)三个部分,中间部分又分为左(商 ...
- prototype、proto和constructor 关系
记录: 1.构造函数:如下,Foo()就是一个构造函数 function Foo(){} 2.prototype:每一个构造函数都有一个属性叫prototype,相当于一个指针,指向它的原型对象 Fo ...
- python中匿名函数lambda如何用
python中经常用到的一个函数:匿名函数lambda ,什么是匿名函数?匿名函数的意义是什么?匿名函数怎么样用?(疑问三连,what,why,how) 一,什么是匿名函数? python中没有名字的 ...
- StringUtils 方法全集
最近做项目需要,经常需要最字符串进行拆分等操作,经搜索和研究,发现了一篇StringUtils方法全集的文章,不错,特贴出来,以后用: 参考:http://blog.sina.com.cn/s/blo ...
- python random模块随机取list中的某个值
import random from random import randint ''' random.randint()随机生一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,pyth ...
- Missing artifact net.sf.json-lib:json-lib:jar:2.4
Missing artifact net.sf.json-lib:json-lib:jar:2.4 出现上述这种错误就是JAR没有引入进来 这时候发现是因为JDK版本的问题,所以需要在加一句 < ...
- POJ 1789 Truck History (Kruskal)
题目链接:POJ 1789 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks ...
- VIM 单词大小写转换
遇到大小写转换的时候,我觉得首先一个不应该直接放弃的选择就是采用正则表达式以及文本替换功能.不过,针对单个单词的转换在VIM中还有更为简单的方式. 组合命令gUw可以实现把光标当前所在位置的一个单词转 ...