算法竞赛进阶指南0x36组合计数
概述


AcWing211. 计算系数

#include <bits/stdc++.h>
using namespace std;
const int mod = 10007 ;
int ksm(int a, int b, int p)
{
int ans = 1%p;
a = a%p;
while(b)
{
if(b&1) ans = (long long)ans * a % p;
a = (long long)a*a%p;
b>>=1;
}
return ans;
}
int jie(int n)
{
int ans = 1;
for(int i = 1; i <= n; i++)
{
ans = (long long)ans * i %mod;
}
return ans;
}
int niyuan(int x)
{
return ksm(x, mod-2, mod);
}
int main()
{
int a,b,k,n,m;
cin >> a >> b >> k >> n >> m;
int fenzi = jie(k);
int fenmu = jie(k-m)*jie(m) % mod;
int CC = fenzi * niyuan(fenmu)%mod;
int asn = ksm(a, n, mod)*ksm(b, m, mod)%mod*CC%mod;
printf("%d", asn);
return 0;
}
多重集

AcWing212. 计数交换


Lucas定理
古代猪文
先对合数进行分解的代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x = 999911658;
for(int i = 2; (long long)i*i <= x; i++)
{
if(x % i==0)
{
printf("%d\t", i);
int cnt = 0;
while(x%i==0)
{
x /= i;
cnt ++;
}
printf("%d\n", cnt);
}
}
if(x > 1)
printf("%d\t1\n", x);
return 0;
}
运行结果
2 1
3 1
4679 1
35617 1
Catalan定理
证明如下:
证明要点:
- 从反方向来进行考虑
- 把一个不好计数的集合与一个已知的可计数的集合建立一一映射
容易得到:
总共有 \(C^n_{2n}\) 种情况。
现在思考不成立的情况:
建立映射:
| P(不合法情况集合) | Q(有n-1个0,n+1个1) |
|---|---|
| 找到一个最短的前缀,不满足条件。(这个前缀里面有1的个数比0的个数多1) 然后把其他部分取反,得到q | 同左,找到最短的前缀,使得前缀里面有1的个数比0的个数多1 然后把后面取反 |
容易证明:
已知一个不合法的原情况,可以映射到Q。
而在Q中,也可以映射到P。
说明两个集合相互包含,进而得到两个集合相等。
故个数相等。
所以不合法的情况有 \(C^{n-1}_{2n}\) 种。
相减,得到Katalan数列的个数。
\({C^{n}_{2n}}\over{n+1}\)
算法竞赛进阶指南0x36组合计数的更多相关文章
- 算法竞赛进阶指南 0x52 背包
背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选 ...
- 算法竞赛进阶指南 0x43 线段树
目录 线段树简介 线段树的简单代码实现 建树代码 修改操作 查询操作 线段树的查询操作的时间复杂度分析: AcWing245. 你能回答这些问题吗 思路 代码[时间复杂度:\(O( \space(N+ ...
- 《算法竞赛进阶指南》0x10 基本数据结构 Hash
Hash的基本知识 字符串hash算法将字符串看成p进制数字,再将结果mod q例如:abcabcdefg 将字母转换位数字(1231234567)=(1*p9+2*p8+3*p7+1*p6+2*p5 ...
- 《算法竞赛进阶指南》1.4Hash
137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一 ...
- bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南
题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...
- POJ1639 算法竞赛进阶指南 野餐规划
题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合 ...
- 算法竞赛进阶指南 0x00 基本算法
放在原来这个地方不太方便,影响阅读体验.为了读者能更好的刷题,另起一篇随笔. 0x00 基本算法 0x01 位运算 [题目][64位整数乘法] 知识点:快速幂思想的灵活运用 [题目][最短Hamilt ...
- 算法竞赛进阶指南--快速幂,求a^b mod p
// 快速幂,求a^b mod p int power(int a, int b, int p) { int ans = 1; for (; b; b >>= 1) { if (b &am ...
- 算法竞赛进阶指南0x51 线性DP
AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置 ...
随机推荐
- CSS书写及命名规范
1.样式书写顺序 positioning定位::position.display.float.top. right.bottom.left.overflow.clear.z-index: box mo ...
- web安全之自己写一个扫描器
web安全之自己写一个扫描器 自己来写一个简单的目录扫描器,了解扫描器的运转机制和原理,因为python写脚本比较容易所以用python写一个网站目录扫描器. 第一步:我们需要导入所需要的库 1 im ...
- 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。
假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据.编写程序,完成下 ...
- AQS源码探究之竞争锁资源
AQS源码探究---竞争锁资源 我们进入ReentrantLock源码中查看其内部类 Sync 对AQS进行扩展公共方法并定义抽象方法的抽象类 FaireSync 实现公平锁的AQS的实现类 UnFa ...
- drools中Fact的equality modes
一.equality modes介绍 在drools中存在如下2种equality modes. 1.identity模式 identity:这是默认的情况.drools引擎使用IdentityHas ...
- 6. ZigZag Conversion - LeetCode
Question 6. ZigZag Conversion Solution 题目大意:将字符串按Z字型排列,然后再一行一行按字符输出 思路:按题目中的第一个例子,画出如下图,通过n的不同值,可以找出 ...
- BERT的优化演进方法汇总(持续更新)
模型结构演进 本文以演进方向和目的为线索梳理了一些我常见到但不是很熟悉的预训练语言模型,首先来看看"完全版的BERT":RoBERTa: A Robustly Optimized ...
- [CSP-S 2019 Day2]Emiya家今天的饭
思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗 ...
- 创建NuGet本地包源
NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库.使用Visual Studio 可以很方便地将类库等项目打包发布,最简单的办法是上传到Nuget ...
- 变量作用域——JavaSE基础
变量作用域 局部变量.成员变量.静态变量的区别 类型 声明位置 从属于 生命周期 局部变量 方法或语句块内部 方法/语句块 从声明位置开始,直到方法或语句块执行完毕,局部变量消失 成员变量 (实例变量 ...