[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个集合已经是确 ...
随机推荐
- 【MySQL】常用的命令
连接数据库 mysql -u root -pmysql -u root -h 192.168.16.140 -p 创建数据库 create database dbstudents; 查看所有数据库 s ...
- Jenkins用户权限管理-Role-based Authorization Strategy插件
02-Jenkins用户权限管理-Role-based Authorization Strategy插件 在jenkins的使用过程中,需要给用户分配只管理特定项目的权限来保证项目相关人员只能管理对应 ...
- python之set集合,基础篇
集合:set 特点:1>.无序 ,因为集合是无序的,所以不可用下标值查询,也不可切片2>.去重 ,一个集合内不能有两个相同的元素3>.可添加,可删除,不可修改等等4>.集合内的 ...
- POJ 1269 Intersecting Lines 判断两直线关系
用的是初中学的方法 #include <iostream> #include <cstdio> #include <cstring> #include <al ...
- Retrofit使用Kotlin协程发送请求
Retrofit2.6开始增加了对Kotlin协程的支持,可以通过suspend函数进行异步调用.本文简单介绍一下Retrofit中协程的使用 导入依赖 app的build文件中加入: impleme ...
- 浅读tomcat架构设计之Pipeline-Valve管道(4)
tomcat Container容器处理请求是使用Pipeline-Valve管道来处理的,后续写的tomcat内存马,和他紧密结合 Pipeline-Valve是责任链模式,责任链模式是指在一个请求 ...
- Linux:监测收集linux服务器性能数据工具Sysstat的使用与安装
Sysstat是一个工具集,包括sar.pidstat.iostat.mpstat.sadf.sadc.其中sar是其中最强大,也是最能符合我们测试要求的工具,同时pidstat也是非常有用的东东,因 ...
- Log4.net示例
//先用Nuget安装最新Log4net using System; using System.IO; using log4net; using log4net.Config; using log4n ...
- 深入理解Java多线程——线程池
目录 为什么需要线程池 定义 ThreadPoolExecutor 工作队列workQueue 不同的线程池 Executor 线程池的工作原理 线程池生命周期 线程池增长策略 线程池大小的设置 线程 ...
- Java基础——自己的总结
Java Java是什么? Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作 ...