这是一道很好的组合数学题。

对于和我一样五音里面有六音不全的人来说,我们就应该转换一下题目的意思:

一句话题意:

题目的意思就是说要从一个有 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;

说实话,还有一种预处理方式,但我导完式子之后就不想打了,在这里还是推导一遍吧。。。

\[A_{2^n-1}^{i-1} = \frac{(2^n - 1)!}{(2^n -1-i+1)!} = \frac{\prod_{j=1}^{2^n-1}j}{\prod_{j=1}^{2^n-i}j} =
\]
\[\frac{\prod_{j={2^n-i+1}}^{2^n-1}j * \prod_{j=1}^{2^n-i}j}{\prod_{j=1}^{2^n-i}j}
= {\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卡农的更多相关文章

  1. [HNOI 2011]卡农

    Description 题库链接 在集合 \(S=\{1,2,...,n\}\) 中选出 \(m\) 个子集,满足三点性质: 所有选出的 \(m\) 个子集都不能为空. 所有选出的 \(m\) 个子集 ...

  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. 【NX二次开发】指定矢量控件,记住上次选择的方向

    block UI控件如果有RetainValue属性,就用这个属性.没有这个属性可以参考下面这种方法.以矢量控件为例: 1.在apply_cb回调中,将控件值保存到文本中 double TopForT ...

  2. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  3. 使用pdb进行Python调试

    调试应用有时是一个不受欢迎的工作,当你长期编码之后,只希望写的代码顺利运行.但是,很多情况下,我们需要学习一个新的语言功能或者实验检测新的方法,从而去理解其中运行的机制原理. 即使不考虑这样的场景,调 ...

  4. 《算法详解:C++11语言描述》已出版

    经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...

  5. 从零实操基于WSL2 Docker部署Asp.Net Core项目

    前言 平日在公司里都是基于阿里Teambition中的飞流进行Docker部署Api项目或服务,已经习惯了那一套成熟的操作流程,开发和部署确实快捷方便,但是还没在自己的电脑上进行操作过,特别是Wind ...

  6. 4.3Unicode和ASCII码

  7. AcWing 1273. 天才的记忆

    从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏. 在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏. 题目是这样的:给你一大串 ...

  8. 资源:Redis下载地址

    Redis的下载路径 http://download.redis.io/releases/  3.x(支持集群)  2.x不支持集群   (推荐使用3.0+版本)     副版本号为偶数时,表示是稳定 ...

  9. Acunetix与WAF集成:Acunetix和F5 BigIP ASM

    该的Acunetix API让您有机会来实现任务自动化,从而提高效率-尤其是当你可以用加速您的工作流程的其他组件的功能整合.在此示例中,我们将在上一篇文章的基础上,向您展示如何在Bash脚本中使用Ac ...

  10. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...