【题意】
  求出由多少个不同的集合满足下列条件:

    1.集合内含有m个不同的非空数集,每个数集由若干个不同的1~n的数组成。

    2.集合内每个1~n的整数在本集合的所有数集中总共出现偶数次。
  以上提到的集合和数集均不考虑元素的顺序,即含有的元素相同但元素顺序不同被视为同一种集合。
【题解】
  还是得强调看了题解,思想很巧妙。。。。
  直接套式子求出题意所求的集合数是比较困难的。
  所以考虑补集转化的思想。
  首先我们把所有元素顺序不同的集合当不同的算,这样会比较容易,只要方案数最后除去m!就是答案了。。。
  设f[x]为仅需选取x个不同数集就满足条件2的集合数。
  假设为了满足条件2,那么显然在选取了m-1个不同数集之后,剩下那个数集是确定的。
  这样就有P(2^n-1,m-1)这样的数集。
  但这个确定的数集被选取之后可能会不满足条件1。总的有2种情况:
    1.前m-1个集合已满足条件2,使得剩下的数集为空集。(有f[m-1]个这样的集合)
    2.选取的剩下那个数集与之前m-1个的某一个相同。(有f[m-2]*(m-1)*(2^n-1-(m-2))个……)
  所以我们得减去这2种集合的数量。
  递推式即为:
  f[m]=A(2^n-1,m-1)-f[m-1]-f[m-2]*(m-1)*(2^n-1-(m-2))
  最后只要除以m!就行了。
【代码】

 1 #include <iostream>
 2 #include <cstdio>
 3 typedef long long ll;
 4 using namespace std;
 5 const int mo=1e8+7;
 6 const int N=1000005;
 7 int a,n,m,s,f[N],A[N];
 8 int exp(int x,int k,int p)
 9 {
10     int s=1;
11     for (;k;x=(ll)x*x%p,k>>=1)
12         if (k&1)    s=(ll)s*x%p;
13     return s;
14 }
15 int inv(int x,int p)
16 {
17     return exp(x,p-2,p);
18 }
19 void pre()
20 {
21     a=exp(2,n,mo)-1;
22     A[0]=1;
23     for (int i=1;i<=m;++i)
24         A[i]=(ll)A[i-1]*((a-i+1)+mo)%mo;
25 }
26 int main()
27 {
28     cin>>n>>m;
29     pre();
30     f[0]=1;f[1]=0;
31     for (int i=2;i<=m;++i)
32         f[i]=((A[i-1]-f[i-1]-(ll)f[i-2]*(i-1)%mo*(a-(i-2)+mo)%mo)%mo+mo)%mo;
33     s=1;
34     for (int i=1;i<=m;++i)
35         s=(ll)s*i%mo;
36     cout<<(ll)f[m]*inv(s,mo)%mo<<endl;
37     return 0;
38 }

View Code

转载于:https://www.cnblogs.com/Bleacher/p/7688242.html

bzoj2339: [HNOI2011]卡农相关推荐

  1. [BZOJ2339][HNOI2011]卡农

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

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

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

  3. BZOJ2339: [HNOI2011]卡农(dp 容斥)

    题意 从$1 - n$中任意选择一些数,选$m$次构成$m$个集合 保证: 集合不为空 任意两个集合不相同 集合内各个元素xor起来等于0 Sol 神仙题Orz 我看到两种做法,一种是洛谷题解上的直接 ...

  4. P3214 [HNOI2011] 卡农 题解

    P3214 [HNOI2011] 卡农 文章目录 代码 题解 前言 正文 要素 代码 #include <bits/stdc++.h> using namespace std;#defin ...

  5. [HNOI2011] 卡农 题解

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

  6. [HNOI2011]卡农

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

  7. [Luogu P3214] [BZOJ 4339] [HNOI2011]卡农

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

  8. HNOI2011 卡农

    题目传送门 Description \(n​\)种元素,构成\(m​\)个集合\((n,m\leq 10^6)\),保证集合互不相同且非空,且每个元素总出现次数为偶数,两种方案集合重新排列可互相得到算 ...

  9. 数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

    丝且人一口 Virus Tree 2 description solution code RGB Coloring description solution code 123 Triangle des ...

  10. 平遥摄影展:卡农•布斯克茨和他的「一天的结束」

    平遥国际摄影展,一年一度,端相机人的节日.满街是镜头和摄影背心的攒动.我朋友说:没看到好照片,倒是看到不少好相机.这或许就是中国摄影界的写照,也是平遥摄影展的困境.如果没遇到布斯科茨,或许我真的白来平 ...

最新文章

  1. 线上分享会预告之三维模型检索技术介绍
  2. React.js 小书 Lesson12 - state vs props
  3. 前端技术周刊 2019-02-26:前端代码保护
  4. vc 文本框 只显示下划线_【Axure9百例】36.文本框搜索自动匹配
  5. php异步方案,PHP的异步实现方式
  6. mysql data_add data_sub
  7. 在应用程序级别以外使用注册为 allowDefinition='MachineToApplication' 的节是错误
  8. kubectl logs -f tail 显示100_系统管理员应该知道的9个kubectl命令
  9. c语言结构引用6,C语言6结构体练习题6
  10. 微信公众号开发之微信服务器配置
  11. 编译OpenJDK12:Target CPU mismatch. We are building for x86_64 but CL is for ; expected x64
  12. Linux笔记 No.22---(Linux - PAM)
  13. 中国土地市场网-js解密
  14. 手写喜马拉雅APP特效
  15. oracle查看主备库延迟时间,【分享】Oracle 主备库容灾维护常用的九个SQL
  16. Explaining complex machine learning models with LIME
  17. 电信运营商的网络介绍
  18. 传智播客黑马Java学习笔记_day08_2
  19. 在龙芯3a5000处理器上进行qt-5.11.3源码编译流程与遇到的问题
  20. 如何下载Chrome商店的插件crx到本地?

热门文章

  1. oracle不能插入,oracle – 在过程中截断和插入不能一起工作
  2. monkey命令_Monkey 稳定性测试
  3. linux安装python的拓展包,linux 安装python拓展包pexpect
  4. jdbc代码_Mysql Java 驱动代码阅读笔记及 JDBC 规范笔记
  5. docker设置不同网络和迁移到指定网络
  6. 正常访问静态文件,不要找不到静态文件报404
  7. [PHP] - Laravel 5 的 Hello Wold
  8. HDU 3996 Gold Mine【最大闭合权图】
  9. CSS行高line-height属性理解及应用
  10. 【tensorRT文档翻译】7. Working With Dynamic Shapes