【BZOJ2339】【HNOI2011】卡农

题解:

  首先用二进制表示每个音阶是否使用,那么共有$2^{n}-1$(空集不可行)种片段,用$a_{i}$来表示每个片段,问题就是求满足$a_{1}\left (xor\right)a_{2}\left (xor\right)......\left (xor\right)a_{m}==0\&\&a_{i}!=a_{j},1<=i<j<=m$的方案数,我们用$f_{i}$表示片段数为i时,且满足前面式子的答案。

  那么首先我们在选取i个片段时,必然是由前i-1个片段决定的,所以共有$A_{2^{n}-1}^{i-1}$种选取方案。其中若i-1个时已满足其异或和为0,那么此时是不合法的,所以需要减去$f_{i-1}$,考虑出现重复的情况,因为出现了重复,又有异或的逆运算就是本身,这也就意味着除去两个重复的片段的i-2个片段已经满足其异或和为0,而这个重复的片段在i-1个片段中的位置有i-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!$即可。

 

 1 #include<cstdio>
 2 typedef long long ll;
 3 const ll mod=100000007;
 4 const int N=1000100;
 5 ll n,m;
 6 ll powmod(ll a,ll b){
 7     ll ans=1;
 8     a%=mod;
 9     for(;b;b>>=1,a=a*a%mod)
10         if(b&1) ans=ans*a%mod;
11     return ans;
12 }
13 ll tot;
14 ll jie;
15 ll fac[N];
16 inline void init(){
17     fac[0]=1;
18     for(ll i=1;i<=m;i++)
19         fac[i]=fac[i-1]*(tot-i+1)%mod;
20 }
21
22 ll f[N];
23 int main(){
24     scanf("%lld%lld",&n,&m);
25     tot=powmod(2LL,n);
26     tot--;
27     if(tot<0)   tot+=mod;
28     init();
29     for(ll i=3;i<=m;i++){
30         f[i]=(fac[i-1]-f[i-1])%mod-f[i-2]*(i-1)%mod*(tot-i+2)%mod;
31         f[i]%=mod;
32     }
33     ll tt=1;
34     for(ll i=1;i<=m;++i)
35         tt=tt*i%mod;
36     tt=powmod(tt,mod-2);
37     printf("%lld\n",(f[m]*tt%mod+mod)%mod);
38 }
时间: 2024-12-28 11:36:14

【BZOJ2339】【HNOI2011】卡农的相关文章

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

[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确定的了.因为内层集合的n个元素可以随便出现,那么总数就是A(2^n-1,m-1).但是可能存在不合法的情况. 1.在前m-1个集合中,n个数出现的次数已经都是偶数了,那么第m个集合为空,不合法,此时方案数为f[m-1].2.第m个集合与之前某个集合相同,那么我们不考虑这两个集合,剩下的方案数为f[i

BZOJ 2339[HNOI2011]卡农

题面: 2339: [HNOI2011]卡农 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 807  Solved: 483[Submit][Status][Discuss] Description 令f[i]为前i个集合满足条件的方案数,则前i-1个集合确定后,第i个也随之确定(元素出现偶数次). f[i]=A[m][i-1]-f[i-1](前i-1个集合已经满足元素出现偶数次)-f[i-2]*(i-1)*(2^n-1-i+2)(第i个集合在前

[HNOI2011]卡农

题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的和声,即从 n 个音阶中挑选若干个音阶同时演奏出来.为了强调与卡农的不同,他规定任意两个片段所包含的音阶集合都不同.同时为了保持音乐的规律性,他还规定在一段音乐中每个音阶被奏响的次数为偶数.现在的问题是:小余想知道包含 m 个片段的音乐一共有多少种.两段音乐 a 和 b 同种当且仅当将 a 的片段重

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

题目描述 题解 dp+容斥原理 先考虑有序数列的个数,然后除以$m!$即为集合的个数. 设$f[i]$表示选出$i$个集合作为满足条件的有序数列的方案数. 直接求$f[i]$较为困难,考虑容斥,满足条件的有序数列的方案数=总方案数-不满足条件的方案数. 考虑如果前$i-1$个集合确定,那么第$i$个集合也一定确定,总方案数为$2^n-1$个满足条件的集合(不包括空集)中取出$i-1$个的排列$A_{2^n-1}^{i-1}$. 不满足条件的方案有两种: 1.根据前$i-1$个集合确定的第$i$个

BZOJ 2339 HNOI2011 卡农 组合数学

题目大意:求由1~n构成的m个集合有多少种 其中1~n中每个数都出现了偶数次 围观题解: http://blog.csdn.net/orpinex/article/details/7405538 吾等蒟蒻到底也只会看题解了- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 #define MOD 10000000

Bzoj2339--Hnoi2011卡农

题意 : 给你n个音阶,要求组成一个长m个片段的音乐有多少方案. 每个片段里每种音阶至多含有一个,任意两个片段包含的音阶不能完全相同,并且每一种音乐里每个音阶出现的次数必须是偶数次. 两个音乐不同的话当且仅当不存在任意一种对应方案使a包含的片段与b包含的片段完全相同. eg. {{1,2},{2,3}}与{{2,3},{1,2}}是相同的音乐.(虽然都不是合法的音乐 数据范围 :n,m <= 1000000 --------------------------------------------

YCB 的暑期计划

前言 YCB现在很弱(TAT) 暑假有一个月,赶快狂补一下. 大概的计划如下: 首先前期会以数据结构为主,毕竟代码能力太弱,涉及内容:线段树分治.二进制分组.KD-Tree. 等数据结构做到没有智商的时候加入一波数论,内容为 杜教筛.min_25筛. 然后中途小清新一下,做一些 组合博弈与构造题. 接着继续练代码能力,顺便学一些神奇的暴力:启发式合并.dsu on tree . 然后图论也忘的差不多了,就回过头去学点新东西,大概会有spfa判负环.0/1分数规划.差分约束. 估计这个时候也没有什

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

我的麦克风接线

真是书到用时方恨少呀,记得当时买来这个麦克风,后又一段时间没用,就一直放着.有一次突然想了起来,就找来了我的麦克风,可谁曾想到竟然坏掉了,怎么办,没办法,只能修了,自已动手修吧,正所谓自已动手丰衣足食,嘿嘿. 就想可能是线哪儿断了,当时家里也没万用表,现买吧又太麻烦了,就用笨方法吧.想了下,这么长的线总不能都断了吧,碰下运气,就直接将线剪断了一半来重新接线,整了半天也接好了,还是没音,郁闷呀! 难道不是线的问题,于是就动手折起了麦克风,不折到好,一折傻眼了,这里面有个电池,当时就想卖家也真是的也