Description

题库链接

在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质:

  1. 所有选出的 \(m\) 个子集都不能为空。
  2. 所有选出的 \(m\) 个子集中,不能存在两个完全一样的集合。
  3. 所有选出的 \(m\) 个子集中, \(1\) 到 \(n\) 每个元素出现的次数必须是偶数。

\(1\leq n,m\leq 1000000\)

Solution

一开始想着去容斥出现奇数次的元素。发现是 \(O(n^2)\) 的。只好去颓题解了...

转化一下思路,注意到这样一个性质:假若我要选出 \(i\) 个子集,只要我选出了 \(i-1\) 个子集,那么剩下一个子集是存在且唯一的。

注意到这样的性质,容易发现剩下的 \(DP\) 过程就和 [BZOJ 2169]连边 的思路是类似的。

类似地,记 \(f_i\) 为有序地选出 \(i\) 个非空集合的合法方案数。由上面所说的 \(f_i=A_{2^n-1}^i\) 。但是这样会有不合法的情况。

首先,我们试着考虑去掉不满足 \(1\) 的条件。显然为空的集合只会是最后一个被动选的集合,那么不满足该情况的方案有 \(f_{i-1}\) 种;

其次再看不满足 \(2\) 情况的方案数。显然重复只会和 \(i-1\) 个集合中的 \(1\) 个集合重复。这样的条件为 \(f_{i-2}\cdot(2^n-1-(i-2))\cdot(i-1)\) 。

有序变无序答案就是 \(\frac{f_m}{m!}\) 。

Code

//It is made by Awson on 2018.3.4
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int yzh = 100000007, N = 1000000;
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); } int n, m, A[N+5], f[N+5]; int quick_pow(int a, int b) {
int ans = 1;
while (b) {
if (b&1) ans = 1ll*ans*a%yzh;
a = 1ll*a*a%yzh, b >>= 1;
}
return ans;
}
void work() {
read(n), read(m); n = quick_pow(2, n)-1; f[0] = 1;
A[1] = n; for (int i = 2; i <= m; i++) A[i] = 1ll*A[i-1]*(n-i+1)%yzh;
for (int i = 2; i <= m; i++) f[i] = (A[i-1]-f[i-1])%yzh, f[i] = (f[i]-1ll*f[i-2]*(n-i+2)%yzh*(i-1)%yzh)%yzh;
int t = 1; for (int i = 1; i <= m; i++) t = 1ll*i*t%yzh; t = 1ll*f[m]*quick_pow(t, yzh-2)%yzh;
writeln((t+yzh)%yzh);
}
int main() {
work(); return 0;
}

[HNOI 2011]卡农的更多相关文章

  1. [HNOI]2011卡农

    这是一道很好的组合数学题. 对于和我一样五音里面有六音不全的人来说,我们就应该转换一下题目的意思: 一句话题意: 题目的意思就是说要从一个有 n 个元素的集合当中选出一个长度为m的集合,然后满足: 1 ...

  2. P3214 [HNOI2011]卡农

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

  3. [BZOJ2339][HNOI2011]卡农

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

  4. [HNOI2011]卡农

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

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

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

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

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

  7. BZOJ 2339 【HNOI2011】 卡农

    题目链接:卡农 听说这道题是经典题? 首先明确一下题意(我在这里纠结了好久):有\(n\)个数,要求你选出\(m\)个不同的子集,使得每个数都出现了偶数次.无先后顺序. 这道题就是一道数学题.显然我们 ...

  8. 【BZOJ2339】卡农(递推,容斥)

    [BZOJ2339]卡农(递推,容斥) 题面 BZOJ 题解 先简化一下题意: 在\([1,2^n-1]\)中选择不重复的\(m\)个数,使得他们异或和为\(0\)的方案数. 我们设\(f[i]\)表 ...

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

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

随机推荐

  1. Git忽略规则.gitignore梳理

    对于经常使用Git的朋友来说,.gitignore配置一定不会陌生.废话不说多了,接下来就来说说这个.gitignore的使用. 首先要强调一点,这个文件的完整文件名就是".gitignor ...

  2. java web 初学

    我希望在本学期本堂课上学会使用java web 框架 精通mvc架构模式 学会通过框架和数据库对产品进行构造与编写. 我计划每周用16小时的时间进行学习java web 一周4学时上课时间 周一到周五 ...

  3. python第三方库requests详解

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  4. sys模块的使用

    import sys,time ''' if sys.argv[1]=='sleepy': print('nongsi') else: print('....')''' #进度条 for i in r ...

  5. GPUImage实战问题解决

    在项目中遇到了使用完GPUImage以后,内存不释放的问题,翻阅官方API,找到了解决方法: deinit{ GPUImageContext.sharedImageProcessingContext( ...

  6. 解决background图片拉伸问题

    ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...

  7. 【深度学习】深入理解Batch Normalization批标准化

    这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...

  8. tcltk控制chariot进行测试 couldn't load library "ChariotExt": invalid argument

    解决办法:和tcl版本有关,我的chariot应该是32位的,下载win32-ix86的tcl解决了,用64位的有这个错误提示. ActiveTcl8.6.4.1.299124-win32-ix86- ...

  9. C# 使用 ffmpeg 进行音频转码

    先放一下 ffmpeg 的官方文档以及下载地址: 官方文档:http://ffmpeg.org/ffmpeg.html 下载地址:http://ffmpeg.org/download.html 用 f ...

  10. 使用freemaker 导出word 含多张图片,若无图片则显示文本信息

    1.使用的Microsoft Office 2007,添加一个无边框的表格,并插入一张图片,最后另存为编码utf-8,一开始保存的word xml格式的,图片的base64编码位于文档最后,暂时没有找 ...