[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 的结果。【输入输出样例】
输入输出样例
2 3
1
说明
样例解释:音乐为{{1},{2},{1,2}}
首先题目里说是无序的,但是不要管它,我们先把它看成有序的,最后除以一个m!即可。我们考虑补集转换,首先所有的子集个数应该是2^n−1,我们定义f[i]为挑选i个片段的合法的方案数,此时总数应该是A(2^n−1,i−1)(排列数)。为什么是i−1而不是i呢?因为要保证总数是偶数,也就是说如果你确定了i−1个片段第i个片段也就确定了。而这样肯定多算了,具体来说有两部分:
1、如果前i−1个已经合法,那么第i个就是空集,这样肯定不合法,所以要减去f[i−1]。
2、如果根据前i−1个确定出来的第i个集合和前面的某一个重复,这样肯定是不合法的。
因为考虑顺序,所以那个和第i个重复的集合有i−1种位置,对于每种位置,
当前的总数偶数去掉两个数之后还是偶数,所以剩下其他数的方案数为f[i−2]。
然后我们需要算出有多少种可能重复的方案,因为我们已经确定了(i−2)个位置,所以方案数为(2^n−1−(i−2))。
所以总体的方程就是:f[i]=A(2^n−1,i−1)−f[i−1]−f[i−2]∗(2^n−1−(i−2))∗(i−1)
最后在乘上一个m!关于mod的逆元即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long Mod=,s;
long long n,m;
long long pre[],A[],f[];
long long qpow(long long x,int y)
{
long long res=;
while (y)
{
if (y%==)
{
res=(res*x)%Mod;
}
x=(x*x)%Mod;
y/=;
}
return res;
}
int main()
{long long i;
cin>>n>>m;
s=(qpow(,n)-+Mod)%Mod;
//p=qpow(2,n)%Mod;
pre[]=;
for (i=;i<=m;i++)
{
pre[i]=(pre[i-]*(s-i++Mod)%Mod)%Mod;
}
A[]=;
for (i=;i<=m;i++)
A[i]=((Mod-Mod/i)*A[Mod%i]+Mod)%Mod;
f[]=;f[]=;
for (i=;i<=m;i++)
{
f[i]=(pre[i-]+Mod)%Mod;
f[i]=(f[i]-f[i-]+Mod)%Mod;
if (f[i]<) f[i]+=Mod;
f[i]=(f[i]-((f[i-]*(i-)%Mod)*((s-i++Mod)%Mod))%Mod+Mod)%Mod;
if (f[i]<) f[i]+=Mod;
}
for (i=;i<=m;i++)
f[m]=(f[m]*A[i])%Mod;
cout<<f[m];
}
[HNOI2011]卡农的更多相关文章
- [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 ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- [HNOI2011]卡农 题解
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
- bzoj 2339: [HNOI2011]卡农
Description Solution 比较难想.... 我们先考虑去掉无序的这个条件,改为有序,最后除 \(m!\) 即可 设 \(f[i]\) 表示前\(i\)个合法集合的方案数 明确一点: 如 ...
- 2339: [HNOI2011]卡农
Description 首先去除顺序不同算一种的麻烦,就是最后答案除以总片段数\(2^m-1\) 设\(f_i\)表示安排\(i\)个片段的合法种类 那么对于任何一个包含\(i-1\)个片段的序列(除 ...
随机推荐
- 第二次作业-关于Steam游戏平台的简单分析
1.1 Steam平台的简单介绍 你选择的产品是? 如题,这次的作业我选择了Steam作为分析的对象. 为什么选择该产品作为分析? 我选择数字游戏贩售平台STEAM作为分析对象的原因有以下几点: 1. ...
- c语言第一次作业——输入与输出格式
一.PTA实验作业 1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 ...
- 敏捷开发每日报告--day4
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- IE bug:ajax请求返回304解决方案
bug说明: 同一账户下的默认收货地址只有一个,默认收货地址可以修改,修改完成后,使用ajax重新加载收货地址部分. 默认收货地址状态标记:status = 1: 在IE浏览器做了修改后,重新加载的数 ...
- Hey,man,are you ok? -- 关于心跳、故障监测、lease机制
电话之于短信.微信的一个很大的不同点在于,前者更加及时,有更快速直接的反馈:而后面两个虽然称之为instant message,但经常时发出去了就得等对方回复,等多久是不确定的.打电话能明确知道对方在 ...
- java 数组排序方法整理,简单易懂,
1.快速排序:首先是最简单的Array.sort,直接进行排序: public static void main(String[] args) { int[] arr = {4,3,5,1,7,9,3 ...
- Python学习之dict和set
#coding=utf-8 # dict dict= {'bob': 40, 'andy': 30} print dict['bob'] # 通过dict提供的get方法,如果key不存在,可以返回N ...
- python/零起点(一、字典)
python/零起点(一.字典) dict( )字典 dict()强型转换成字典类型的数据类型: 字典的键(Key)必须是唯一不可变的 字典是无序,字典可变数据类型,且是可迭代的对象 字典清空操作案例 ...
- Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- vue2路由
我们在前面的学习过程中不管是在学习angular还是vue1,都会遇到二级路由,我们现在先来看一下vue2中的一级路由. 首先要引入的是vue2与路由文件. js代码: <script> ...