[BZOJ2339][HNOI2011]卡农
[BZOJ2339][HNOI2011]卡农
试题描述

输入
见“试题描述”
输出
见“试题描述”
输入示例
见“试题描述”
输出示例
见“试题描述”
数据规模及约定
见“试题描述”
题解
先考虑 m 个 01 串排顺序的情况。可以发现如果定下前 m - 1 个 01 串,那么第 m 个串就可以由前面所有 01 串按位异或得出,所以方案数为 A(2n - 1, m - 1)(即除全 0 串外的所有情况选择 m - 1 个并排列顺序的方案数),现在我们需要减去不合法的情况。我们令 f(m) 表示前 m 个串考虑顺序合法的方案数。
不合法#1:所有 m - 1 个 01 串的异或和为全 0 串,即最后一个填的是全 0 串,那么要减去 f(m - 1)。
不合法#2:最后一个填的串与前 m - 1 个串有重复,那么如果去掉这两个相同的串,剩下的串能组成合法的情况(即 f(m - 2)),然后这个串可能与前 m - 1 个串中任意一个串重复,所以要乘上 m - 1,最后这个重复的串本身有 2n - 1 - (m - 2) 种情况。所以最终需要减去 f(m - 2) * (m - 1) * [2n - 1 - (m - 2)]。
最后再把答案除以 m! 就好了,求一下逆元。
注意不可以用组合数的方法避免排顺序,因为如果这样做了,在“不合法#2”这一步中我们就不能保证对于那 m - 1 个重复的位置每一个都是完整的 f(m - 2) 中情况,可以想象一下如果用组合数,那么方案中的 01 串就按照一固定顺序排好了,那么对于一个特定的串它的位置就没有任意性了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 1000010
#define MOD 100000007
#define LL long long
int f[maxn], A[maxn]; void gcd(LL a, LL b, LL& x, LL& y) {
if(!b){ x = 1; y = 0; return ; }
gcd(b, a % b, y, x); y -= a / b * x;
return ;
}
LL Inv(LL a) {
LL x, y;
gcd(a, MOD, x, y);
x = (x % MOD + MOD) % MOD;
return (x % MOD + MOD) % MOD;
} int main() {
int n = read(), m = read(); int sum2 = 1;
for(int i = 1; i <= n; i++) {
sum2 <<= 1;
if(sum2 >= MOD) sum2 -= MOD;
}
A[0] = 1;
for(int i = 1; i <= m; i++) A[i] = (LL)A[i-1] * ((sum2 - i + MOD) % MOD) % MOD;
f[1] = f[2] = 0; int tmp = 2;
for(int i = 3; i <= m; i++) {
f[i] = A[i-1] - ((LL)f[i-2] * (i - 1) % MOD) * ((sum2 - i + 1 + MOD) % MOD) % MOD;
if(f[i] < 0) f[i] += MOD;
f[i] -= f[i-1];
if(f[i] < 0) f[i] += MOD;
tmp = (LL)tmp * i % MOD;
}
printf("%d\n", (LL)f[m] * Inv(tmp) % MOD); return 0;
}
BTW,这题不能用 fread 优化读入。。。
[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.每种元素出现次数必须为偶数次 我们考 ...
- BZOJ2339 HNOI2011卡农(动态规划+组合数学)
考虑有序选择各子集,最后除以m!即可.设f[i]为选i个子集的合法方案数. 对f[i]考虑容斥,先只满足所有元素出现次数为偶数.确定前i-1个子集后第i个子集是确定的,那么方案数为A(2n-1,i-1 ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
- 【BZOJ2339】卡农(递推,容斥)
[BZOJ2339]卡农(递推,容斥) 题面 BZOJ 题解 先简化一下题意: 在\([1,2^n-1]\)中选择不重复的\(m\)个数,使得他们异或和为\(0\)的方案数. 我们设\(f[i]\)表 ...
- P3214 [HNOI2011]卡农
题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- [HNOI2011]卡农 题解
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- [HNOI2011]卡农 (数论计数,DP)
题面 原题面 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则. 他将声音分成 n n n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 1 1 ...
随机推荐
- java基础(一)对象
对象的创建 Test test = new Test(); Test test = new Test("a"); 其实,对象被创建出来时,对象就是一个对象的引用,这个引用在内存中为 ...
- 【C#】Switch datatype between object and byte[]
This sample shows how to turn object to byte[], as well as turn byte[] to object. So,I can turn any ...
- D3.js:坐标轴
坐标轴: 是可视化图表中经常出现的一种图形,由一些列线段和刻度组成.坐标轴在 SVG 中是没有现成的图形元素的,需要用其他的元素组合构成.D3 提供了坐标轴的组件,如此在 SVG 画布中绘制坐标轴变得 ...
- release management客户端无法连接到release management server的问题解决
参考:http://myalmblog.com/2014/03/error-installing-release-management-client/ 装了服务器,装客户端.然后客户端连不上服务器. ...
- Git 常用命令 更新与提交
整理了一下Git 常用命令,这个版本还是比较好用的,最后附上个人终结版,帮助你快速上手. 取得Git仓库 初始化一个版本仓库 git init Clone远程版本库 git clone yourgit ...
- zabbix 布署实践【6 使用微信公众号-消息模版推送告警】
使用这个服务的前提是,你必须要有一个微信订阅号,或者公众号,并且是通过认证的号 因为认证过后的号才有模版消息和获取用户openid等信息的权限 ,如下,登录微信公众号的登录页后,底下有个接口权限的展示 ...
- [HMLY]1.CocoaPods详解----使用
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 一.什么是cocoaPods 1.为 ...
- 【angular+bootstrap】angular初级的时间选择器
近期的一个项目,是用angular来写的,本来框架就是第一次接触,使用相关插件的时候就感觉更加没有头绪了,其中一个插件就是时间选择器.比较好用时间选择器就是bootstrap里面的datetimepi ...
- C# winform Datagridview 标题居中
DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
- appnium框架以及源码研究
android4.0后,google提供了uiautomator来进行自动化方案,appium在高版本android上就是基于这个,4.0下是基于selendroid. appium相当于一个中转站, ...