[HNOI]2011卡农
这是一道很好的组合数学题。
对于和我一样五音里面有六音不全的人来说,我们就应该转换一下题目的意思:
一句话题意:
题目的意思就是说要从一个有 n 个元素的集合当中选出一个长度为m的集合,然后满足:
1.无序性
2.这每个音阶出现的次数为偶数
3.这些元素满足单一性
4.不为空集
所以考虑组合:::
上过高中的应该都知道,一个拥有 n 个元素的集合,那么它的子集的数量就是 \(2^n\) - 1,那么对于每一个 \(i\),组合的数量就是 \(A_{2^n-1}^{i-1}\) ,之后我们可以发现:
\(2^n\) - 1 的数值大小是固定的,所以我们可以先计算所有的变量之后在最后再去对 \(m!\)进行操作,故可以预处理:
a[0] = 1;//边界
for(register int i=1;i<=m;++i)
a[i] = a[i-1] * (sum - i + 1) % mod;
说实话,还有一种预处理方式,但我导完式子之后就不想打了,在这里还是推导一遍吧。。。
\]
= {\prod_{j={2^n-i+1}}^{2^n-1}j}
\]
这个式子的代码自己敲吧,反正我是不想敲
然后就可以开始dp了:
三种转移:
1.\(f_i = a_i\)
2.\(f_i = f_i - f_{i-1}\)
3.\(f_i = (f_i - f_{i-2} * (i-1) * (2^n - i)\)
相信前面的两个式子大家应该都可以看的懂,那就来解释一下第三个吧:
在选到第\(i\)个数的时候,那么就只剩下\(i-1\)个数来备选,并且我们在实现\(2^n-1\)的时候,我们可以用\(sum - i + 2\)来实现\(sum = 2^n -1\)
所以code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline void f()
{cout<<"fuck"<<endl;}
inline void openfile()
{freopen("t.txt","r",stdin);}
namespace xin
{
#define m(c,num) memset(c,num,sizeof(c))
int n,m;
const int maxn = 1e6+10;
inline int ksm(int x,int y,int mod)
{
int ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod,ans %= mod;
x = x * x % mod,x %= mod;
y >>= 1;
}
return ans;
}
inline void qmod(int &x,int mod)
{x %= mod;}
int a[maxn],f[maxn];
const int mod = 1e8+7;
inline short main()
{
// openfile();
scanf("%lld%lld",&n,&m);
int sum = ksm(2,n,mod) - 1;
a[0] = f[0] = 1;
for(register int i=1;i<=m;++i)
a[i] = a[i-1] * (sum - i + 1) % mod,qmod(a[i],mod);
for(register int i=2;i<=m;++i)
{
f[i] = a[i-1];
f[i] = f[i] - f[i-1];
f[i] = (f[i] - f[i-2] % mod * (i - 1)% mod * (sum - i + 2) % mod + mod) % mod;
}
int jie = 1;
for(register int i=1;i<=m;++i) jie = jie * i % mod,qmod(jie,mod);
int inv = ksm(jie,mod-2,mod);
cout<<f[m] * inv % mod<<endl;
return 0;
}
}
signed main() {return xin::main();}
忽略神仙码风。。。
[HNOI]2011卡农的更多相关文章
- [HNOI 2011]卡农
Description 题库链接 在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质: 所有选出的 \(m\) 个子集都不能为空. 所有选出的 \(m\) 个子集 ...
- P3214 [HNOI2011]卡农
题目 P3214 [HNOI2011]卡农 在被一题容斥\(dp\)完虐之后,打算做一做集合容斥这类的题了 第一次深感HNOI的毒瘤(题做得太少了!!) 做法 求\([1,n]\)组成的集合中选\(m ...
- [BZOJ2339][HNOI2011]卡农
[BZOJ2339][HNOI2011]卡农 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见& ...
- [HNOI2011]卡农
题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的 ...
- 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.每种元素出现次数必须为偶数次 我们考 ...
- BZOJ 2339 【HNOI2011】 卡农
题目链接:卡农 听说这道题是经典题? 首先明确一下题意(我在这里纠结了好久):有\(n\)个数,要求你选出\(m\)个不同的子集,使得每个数都出现了偶数次.无先后顺序. 这道题就是一道数学题.显然我们 ...
- 【BZOJ2339】卡农(递推,容斥)
[BZOJ2339]卡农(递推,容斥) 题面 BZOJ 题解 先简化一下题意: 在\([1,2^n-1]\)中选择不重复的\(m\)个数,使得他们异或和为\(0\)的方案数. 我们设\(f[i]\)表 ...
- 【BZOJ2339】[HNOI2011]卡农 组合数+容斥
[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确 ...
随机推荐
- UF_MTX 矩阵操作
Open C UF_MTX2_copyUF_MTX2_determinantUF_MTX2_identityUF_MTX2_initializeUF_MTX2_multiplyUF_MTX2_mu ...
- Scala语言笔记 - 第二篇
目录 1 Map的基础操作 2 Map生成view和transform解析 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程(Function Programming)能力,记录 ...
- 磁盘文件监控(Java)并发送邮件通知、系统定期执行的办法
以下是通过xml文件进行的监控路径.文件以及邮件信息的配置,读取xml文件使用的是三方jar包:dom4j 收发邮件采用的是最普通的javamail,需要两个jar包,mail.jar和activit ...
- token & refresh token 机制总结
token & refresh token 机制总结 废话 我在项目上写了个配置页面,之前很简单直接登录,毕竟配置页面自己人用就没有做token机制,后来公司的安全审核不过,现在要加上toke ...
- 02 SVN 与 Git 的优缺点
上一篇博客大致聊了聊关于版本控制系统的周边,这一篇我们就来继续唠唠作为近年来最受欢迎的两个版本控制系统的优缺点吧. 聊优缺点之前,先简单了解一下这两个这两个版本控制系统好了: 关于 SVN SVN 概 ...
- 四、JavaSE语言基础之运算符
什么是是运算符 运算符:用于数据运算的符号,运算是一种处理.(注:浮点型数据(float.double)进行运算会出现精度丢失的情况) 运算符大致可分为以下六种: 一.算术运算符:+.-.*./.%. ...
- Docker_CICD笔记
1 环境说明 1.1 机器配置 主机名称 IP地址 系统版本/内存/cpu核数/硬盘 安装软件 controlnode 172.16.1.70/24 centos7.4/4/2/60 docker.d ...
- 6.11、制作windos虚拟机
1.下载kvm支持windows系统的驱动程序: cd /tmp/ wget https://fedorapeople.org/groups/virt/virtio-win/direct-downlo ...
- C#Expression合集
一:总体概览 1:获取属性值: 2:调用方法 3:动态构造条件 4:创建对象 5:Switch Case 6:Try Catch 以及捕获异常信息并输出 7:if esle 8:+ / += 9: ...
- hdu 6050 Funny Function 矩阵快速幂
就算告诉我是矩阵快速幂我也推不出递推式呀!!! 官方题解: 对于任意i>=1,当j>=3时,有通过归纳法可以得到 进而推导出 后来自己重新推导了一遍 #include <iostre ...