《Mathematical Olympiad——组合数学》——计数

今天开始了对《Mathematical Olympiad》小丛书(组合、几何、代数、数论)的组合数学部分的学习。说来惭愧,身为一个大学生现在回头去做高中生玩的数学题去了……学习这套丛书嘛,当然是为了夯实一下数学底子,为了以后走更远的路打好基础。这套丛书的特点是从1往后一直排的习题集,目前个人比较喜欢以解决具体的题目为目的,然后在解题过程中去学习相关的理论和方法。因为这样让学习显得很有目的性,最重要的是,这种方法能够让人持续的做下去(起码是我)。总之今天是个开始,希望在今后的岁月里能够坚持下来,将这套小丛书学完。

笔者关于小丛书的学习文章,基本会按照书中的顺序,对题目进行分析探讨,而需要补充的相关理论知识和原始模型,笔者将会在Richard教授的《组合数学》(机械工业出版社)中给出。

这一章节是讨论计数的相关问题,也就是探讨在一个具体问题中方案数,概念很好理解,但是在具体的问题中却存在着很多思想的玄妙之处。

问题一:将一个2003边形的每个顶点染成红、蓝、绿三种颜色之一,使得相邻顶点的颜色互不相同,请问有多少种满足条件的方法?

分析:直接求解似乎不太现实,将多边形的边数看成变量,我们设置T(n)记录方案数,应用简单的组合计数原理,容易看到T(3) = 6 , T(4) = 18。基于这么有限的条件,我们如何求解T(2003)呢?递推似乎是解决这种问题的好方法。

我们考虑基于T(n-1),在第n-1后面再加一个点形成n边形。

如果第1个点和第n-1个点同色,对于第n个顶点我们有2种选择,而对于剩余n-1个顶点,我们基于n-2个顶点的方案数,每次添加一个和第一个顶点相同颜色的点,便完成了所有情况的构造,此时即得到2T(n-2)种方案。

如果第1个点和第n-1个点异色,那么对于第n个顶点我们只有一种方案,便基于T(n-1)的基础上添加一个点即可,我们得到T(n-1)种方案。

由此我们可以得到结论:T(n) = T(n-1) + 2T(n-2),结合初始条件,T(2003)显然是可求的。

如果说我们有台计算机,那么基于上面的条件其实也就可以求解了,但如果没有的话,我们则需要进一步从这个递推式中挖掘信息。

外延一种根据递推式求解通项的方法:对于递推式a(n+2) = pa(n+1) + qa(n),a1 = α,a2 = β,x^2 + px + q = 0是其特征方程的根,x1、x2为特征方程的解。当x1 != x2,an = Ax1^(n-1) + Bx2^(n-1) ;而当x1 = x2 , an = (A + Bn)x^(n-1)。其中A和B通过初始条件a1、a2的值,利用待定系数的方法求解。

那么考察此题给出递推等式,我们可得出an的通项,T(2003)也不难求解了。

时间: 2024-07-29 00:50:46

《Mathematical Olympiad——组合数学》——计数的相关文章

1415.数的计数

1415. [NOIP2001]数的计数 ☆   输入文件:nums.in   输出文件:nums.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理 l·不作任何处理: 2·在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3·加上数后,继续按此规则进行处理,直到不能再立生自然数为止. [输入格式] 自然数n [输出格式] 满足

1024. 科学计数法 (20)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留. 输入格式: 每个输入包含1个测试用例,即一个以科学计数法表示的实数A.该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999. 输出格式: 对每个测

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

Storm实验 -- 单词计数4

在上一次单词计数的基础上做如下改动: 使用 自定义  分组策略,将首字母相同的单词发送给同一个task计数 自定义 CustomStreamGrouping package com.zhch.v4; import backtype.storm.generated.GlobalStreamId; import backtype.storm.grouping.CustomStreamGrouping; import backtype.storm.task.WorkerTopologyContext;

【BZOJ】【1016】【JSOI2008】最小生成树计数

Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的,再加上权值为2和2的,不也满足题意吗?事实上,如果这样的话……最小生成树应该是1和2,而不是1和3或2和2!!! 所以呢?所以对于一个图来说,最小生成树有几条边权为多少的边,都是固定的!所以我们可以做一遍Kruskal找出这些边权,以及每种边权出现的次数.然后,对于每种边权,比方说出现了$v_i$

实现类似shared_ptr的引用计数

13.27 定义使用引用计数版本的HasPtr #include<iostream> #include<string> #include<new> using namespace std; class HasPtr { public: HasPtr(const string &s=string()):ps(new string(s)),i(0),use(new size_t(1)) {cout<<"constructer"<

单词个数计数

#include<stdio.h> #include<string.h> #define ON 1 #define OFF 0 int main(void) {     int spoon, chopstick, sucker, cup;     spoon = chopstick = sucker = cup = OFF;     while((cup=getchar())!=EOF) {         if(isspace(cup)!=OFF) {//判断是否在单词外面   

Python:使用Counter进行计数统计

计数统计就是统计某一项出现的次数.实际应用中很多需求需要用到这个模型.比如测试样本中某一指出现的次数.日志分析中某一消息出现的频率等等'这种类似的需求有很多实现方法.下面就列举几条. (1)使用dict 看下面代码 #coding=utf-8 data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z'] count_frq = dict() for one in data:      if one in count_frq:           cou

python的计数引用分析(一)

python的垃圾回收采用的是引用计数机制为主和分代回收机制为辅的结合机制,当对象的引用计数变为0时,对象将被销毁,除了解释器默认创建的对象外.(默认对象的引用计数永远不会变成0) 所有的计数引用+1的情况: 一.对象被创建:1.a = 23 这里23这个对象并没有在内存中新建,因为在Python启动解释器的时候会创建一个小整数池,-5~256之间的这些对象会被自动创建加载到内存中等待调用:a = 23是为23这个整数对象增加了一个引用.执行代码: >>> import sys >