题目描述

众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则。他将声音分成 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]卡农 题解的更多相关文章

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

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

  2. [BZOJ2339][HNOI2011]卡农

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

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

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

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

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

  5. P3214 [HNOI2011]卡农

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

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

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

  7. [HNOI2011]卡农

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

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

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

  9. bzoj 2339: [HNOI2011]卡农

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

随机推荐

  1. hdu 6134 Battlestation Operational (莫比乌斯反演+埃式筛)

    Problem Description   > The Death Star, known officially as the DS-1 Orbital Battle Station, also ...

  2. vue中引入路由,如果你懒得写那么

    可以npm i vue-router --save,项目中自动给你写好,vuex也可以

  3. 浏览器 url 编码

    1.问题的由来 : http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 2.网络标准RFC 1738做了硬性规定: 只有字母和数字[0-9 ...

  4. [CSP-S模拟测试]:蛋糕(区间DP)

    题目传送门(内部题34) 输入格式 第一行,一个正整数$n$.第二行,$n$个正整数$a_i$,保证$a_i$互不相等. 输出格式 一行一个整数表示间宫卓司得到的蛋糕大小总和的最大值. 样例 样例输入 ...

  5. 探索Redis设计与实现8:连接底层与表面的数据结构robj

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. Java IO Demo

    //FileReader FileWriter 读写英文    public void FileReaderAndWriter1() throws Exception { File filePath ...

  7. ArcGIS Runtime SDK for .NET (Quartz Beta)之连接ArcGIS Portal

    1. 介绍 ArcGIS Portal作为ArcGIS平台的中枢,在ArcGIS体系中起着至关重要的地位.在ArcGIS Runtime的新架构Quartz中添加了连接ArcGIS Portal(或A ...

  8. 使用Guzzle执行HTTP请求

    Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上.Guzzle提供了简单的接口,构建查询语句.POST请求.分流上传下载大文件.使用HTTP cookies ...

  9. Openstack组建部署 — Environment of Controller Node

    目录 目录 前文列表 Controller Node Install and configure components Setup DNS Server Setup NTP Server Instal ...

  10. 08 java代码块的概述和分类

    08.01_面向对象(代码块的概述和分类) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代 ...