[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\)个合法集合的方案数 明确一点: 如 ...
随机推荐
- php abs()函数 语法
php abs()函数 语法 abs()函数怎么用? abs()函数的作用是返回一个数的绝对值.语法是abs(number),如果参数 number 是 float,则返回的类型也是 float,否则 ...
- appium-Android的驱动程序
Appium Android Driver是Android设备的测试自动化工具.Appium Android驱动程序自动化原生的,混合的和移动的Web应用程序,在模拟器,仿真器和真实设备上进行测试.A ...
- vue+express+mysql +node项目搭建
项目搭建前需要先安装node环境及mysql数据库. 1.利用vue-cli脚手架创建一个vue项目 a.全局安装 npm install -g vue-cli b.初始化项目 vue init we ...
- 解析crontab php自动运行的方法
crontab是linux自带的一个命令 使php自动运行的方法php自动运行有很多方法,这里分以下DZ以及一些通过系统完成的方法和直接触发运行驻留系统的方法.Discuz后台有个计划任务,可以使ph ...
- 提供 web前端、H5、html页面 技术服务
如有前端页面的需求请在评论区留言 第一时间进行回复
- django更换默认数据库sqlite3为pymsql后出现Keyerror:255的解决办法----升级PyMySQL
一.更换数据库的办法: 1.安装PyMySQL 2.修改project目录同名文件下的settings.py:DATABASES = { 'default': { # 'ENGINE': 'djang ...
- linux下lamp.sh一键配置lamp环境流程
linux下lamp.sh一键配置lamp环境流程 一.总结 一句话总结: 2.将网站从github上clone到/data/www/网站域名/ 3.更改网站目录权限:chown -R apache: ...
- #pragma hdrstop
#pragma hdrstop#pragma hdrstop 表示预编译头文件到此为止,后面的头文件不进行预编译.BCB 可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘 ...
- Hive 时间操作函数(转)
1.日期函数UNIX时间戳转日期函数: from_unixtime 语法: from_unixtime(bigint unixtime[, string format]) 返回值: string ...
- 63、saleforce 的 Merchandise 的简单的增删改查
自定义的controller public with sharing class MerchandiseController { public List<Merchandise__c> m ...