zoukankan      html  css  js  c++  java
  • 初赛整理——问题求解

    初赛——问题求解

    公式

    (P^m_n= frac{n!}{(n-m)!}) 有顺序
    (C^m_n= frac{n!}{(n-m)!m!}) 无顺序

    常见计数方法

    特殊优先

    六个人站成一排
    1.甲不在排头,乙不在排尾
    我们要考虑分类,因为甲乙互相影响,举个例子,当甲在排位尾时,乙有5种情况可以选,但是甲如果不在排尾,乙就有4种情况可以选。
    第一类:甲在排尾
    这时乙与其余4个人有5个位置可以选,(P^5_5)
    如果甲不在排尾,那甲有4种情况,乙有4种情况,其余4人有四个位置可以选 (4*4*P^4_4)
    总数就是这两个数相加。

    2.甲不在排头,乙不在排尾,且甲乙不相邻
    这里就要分类讨论甲和乙的位置,稍微有点麻烦。

    第一类:甲在排尾,乙在排头,其余四人有四个位置可以选:(P^4_4)
    第二类:甲在排尾,乙不在排头,乙有3种情况可以选,其余四人有四个位置可以选:(3*P^4_4)
    第三类:甲不在排尾,乙在排头,甲有3种情况可以选,其余四人有四个位置可以选:(3*P^4_4)
    第四类:甲不在排尾,乙不在排头,其余四人有4个位置可以选:(P^4_4*P^3_3)
    注意,这里的(P^3_3)是这样来的:实际上在第四类中,甲乙有4个位置可以选择,我们利用容斥原理,总方案数应该是(P^2_4),甲乙相邻的方案数为(P^1_3*2),那甲乙不相邻的方案数就是(P^2_4-P^1_3*2),那么这个式子的值正好等于(P^3_3)。那么为什么甲乙相邻的方案数为(P^1_3*2)呢?下面自会有解答。

    • 那么其实特殊优先就如同其字面意思一样,优先处理特殊的情况,再处理一般的情况


    捆绑与插空

    8人排成一队

    1.甲乙必须相邻
    运用整体思想,把甲乙看作一个人,那么题目转化为7个人排队,情况数为(P^7_7)注意这里甲乙之间的位置可以互换,共(P^2_2)种,也就是2种情况,所以最终答案就是(P^7_7*2)

    2.甲乙不相邻
    运用容斥原理,用全部情况减去甲乙相邻的情况就是甲乙不相邻的情况:(P^8_8-P^7_7*2)

    3.甲乙必须相邻且甲乙不与丙相邻
    运用容斥原理,易得甲乙丙都相邻的情况为(P^6_6*2*2)注意因为这里我们先把甲乙看做一个人,在把“甲乙”这个人和丙看做一个人,所以应该是(*2*2)而不是(*P^3_3),那么题目情况数为(P^7_7*2-P^6_6*2*2)

    4.甲乙必须相邻,丙丁必须相邻
    把甲乙和丙丁分别看作两个人,则方案书为(P^6_6*2*2)

    5.甲乙不相邻,丙丁不相邻
    用总情况数减去甲乙相邻的情况数,再减去丙丁相邻的情况数,再加上甲乙、丙丁都相邻的情况数,因为在甲乙相邻时丙丁也可能相邻,在丙丁相邻时甲乙也可能相邻,所以甲乙、丙丁都相邻的情况被减掉了两次,也就是第4题的情况数被重复减掉,因此答案为(P^8_8-P^7_7*2-P^7_7*2+P^6_6*2*2)

    • 总结:所谓捆绑就是把几个人看做一个人去排列组合,我们总会忘掉他们自身的排列也可能有不同

    6.某人打了八枪,4枪命中,其中有三枪连续命中
    一共打了四次空枪,那么我们只需要在这四次空枪形成的5个空隙中放入“两枪”(我们把那连续命中的三枪看做一个整体),且这“两枪”不能连续。所以答案为(P^2_5)

    7.马路上10个路灯,需要关掉三盏路灯,但不能关掉两头的,也不能关掉相邻的
    一共有7个灯亮,我们需要在这7个灯形成的6个空隙中(因为两端灯不能关)放入3盏不亮得灯。



    正整数解的个数

    求不定方程(x_1+x_2+x_3+x_4+...x_N=M)正整数解的个数。

    本题相当于一共有M个苹果,在他们形成的M-1个空隙中(前后的空隙不算,因为是正整数解的个数),插入N-1个板子,使得把这M个苹果分成N份,每一份就是这个不定方程的解
    总情况数为(C^{N-1}_{M-1})

    其实这个题相当于把N个一样的球放进M个不同盒子里(不允许空着)

    求不定方程(x_1+x_2+x_3+x_4+...x_N=M)整数解的个数。

    我们设(y_i=x_i+1(1{le}i{le}N))(y_1+y_2+y_3+y_4+...y_N=M+N),转化成了上一个题。

    总情况数(C^{N-1}_{M+N-1})

    球放入盒的组合问题

    本博客主要参考于https://blog.csdn.net/xuqn0606/article/details/81782187

    1.把n个相同的球放入m个不相同的盒子中,不允许空盒
    前文已经讲述,总情况数为(C_{n-1}^{m-1})

    2.把n个相同的球放入m个不相同的盒子中,允许空盒
    考虑分类,每局空盒的个数。
    例如,有H个空盒,则问题转化成把m个相同的球放入n-h个盒子中,不允许空盒
    所以,该题的情况数为:(sum_{h=0}^{m-1}{C^{m-h-1}_{n-1}*C^h_m})

    然后再根据组合数的性质:
    (sum_{h=0}^{m-1}{C^{m-h-1}_{n-1}*C^h_m}=C^{m-1}_{m+n-1})

    对组合数性质了解不多的读者,请参考以下博客https://www.cnblogs.com/xwx2354672579/p/11414497.html

    或许我们可以这样理解:事先在m个盒子中放入m个球,则总数为(C^{m-1}_{m+n-1})

    3.把n个相同球放入m个相同盒子中,允许空盒

    我们设(f(n,m))为总情况数,则有(f(n,m)=f(n,m-1)+f(n-m,m)),且有(f(0,k)=1,f(k,1)=1,在f(n,m)中若n<m则f(n,m)=f(n,n),f(1,k)=f(1,1)=1)
    建议读者自己手动模拟一下,不然不容易理解我接下来所说的。
    我们把这n个球分成m份,我们保证从第1个盒子到第m个盒子是一个不上升的序列,原因是这m个盒子是相同的,若第m个盒子不放,则有(f(n,m-1)),若第m个盒子放,因为我们要保证这个序列是一个不上升的序列所以给第m个和m之前的所有盒子都放一个球,则有(f(n-m,m)),因此就有了上面的那个递推式。

    4.把n个相同球放入m个相同的盒子中,不允许空

    既然是不允许空,那么就先从n个球里面选出m个来往每个盒子里放一个,再讨论。讨论时不用管盒子是否为空,因为你已经将m个盒子里填满了。即(f(n-m,m))

    5.n个不同的球放入m个相同的盒子,不允许空盒

    这里引进:第二类斯特林数
    公式:(S(n,k)=S(n-1,k-1)+S(n-1,k)*k)

    稍微解释一下,(S(n,k))表示把n个球放入k个盒子中,就相当于我先把n-1个球放入k-1个盒子中,再把第n个球放入第k个盒子中,(S(n-1,k-1)),和把前n-1个球放入k个盒子中,再把第n个球放入k个盒子中的一个,有k种情况,(S(n-1,k)*k)
    所以我们能得到递推式:(S(n,k)=S(n-1,k-1)+S(n-1,k)*k,s(i,1)=1,s(i,i)=1)

    记得洛谷上有一个题利用了第二类斯特林数,但是我忘了。

    6.n个不同的球放入m个相同的盒子,允许空盒
    我们枚举空盒的个数,那么很容易得到结果为:(S(n,1)+S(n,2)+S(n,3)+S(n,4)+......S(n,m))

    7.n个不同的球放入m个不同的盒子,不允许空
    从5的基础上,因为在5中盒子没有区别,所以我们再对盒子进行排列就可得到正确答案。故答案为:(S(n,m)*A^m_m)

    8.n个不同的球放入m个不同的盒子中,不允许空
    每个小球都有m种情况

    答案数为(m^n)



    特殊数列:

    卡特兰数

    n个+1和n个-1构成的2n项(a_1,a_2,a_3,a_4,a_5...a_{2n})

    且对于所有k都满足(a_1+a_2+a_3+a_4+a_5...a_{k}{ge}0(1{le}k{le}2n))

    分析:如果满足以上规则,则称其为可接受的,否则就称其为不可接受的,令(A_n)为n个+1和n个-1形成的可接受序列的个数,(U_n)为不可接受的序列个数。
    任意的一个序列,一定要么是可接受的,要么是不可接受的,所以(A_n+U_n=C^n_2n)即在2n个位置中,放n个+1(或-1)的情况书。

    那么对于任何一个不可接受的序列中,一定存在一个最小的k,使得(a_1,+_2+a_3+a_4+a_5...a_{k}<0)

    很显然,k是一个奇数,因为如果k是一个偶数的话,-1的个数一定比+1的个数至少多二,如果第k个数是+1的话,很明显令k-1是满足的,如果第k个数是-1的话,那么因为-1的个数比+1的个数知道多二,所以令k-1也是满足的,故k只能是一个奇数
    并且,第k个数一定是-1,因为如果第k个数是+1的话,令k-1也是满足的。所以第k个数一定是-1
    并且,前k-1个数一定是一半是-1,一半是+1,否则k-1也是满足的(似乎说来说去就说了这一件事)。

    注意,如果我们把这k个数取相反数,后面的数不变,就得到了一个有n+1个+1和n-1个-1得数列,怎么理解?由上我们已经知道,这k个数包含(k-1)/2个+1,(k-1)/2+1个-1,则k后面的数,一共有n-(k-1)/2个+1,n-(k-1)/2-1个-1。取完相反数后,前k个数中,有(k-1)/2个-1,(k-1)/2+1个+1,那么变换后总共有n+1个+1,n-1个-1。
    注意,这个变换是可逆的,对于有n+1个+1和n-1个-1的数列,我们只需要找到最小的k,使得(a_1,+_2+a_3+a_4+a_5...a_{k}>0),再取相反数,就能得到原数列。
    由此我们可以说,不可接受的序列,和有n+1个+1和n-1个-1的数列是一一对应的,所以,n+1个+1和n-1个-1的数列的个数,就是不可接受序列的个数
    所以(U_n=C^{n+1}_{2n}={dfrac{n}{n+1}}*C_{2n}^n)
    又因为(A_n+U_n=C^n_2n)
    所以(A_n={dfrac{1}{n+1}}*C_{2n}^n)
    这就是卡特兰数的通项公式,数列{(A_n)}就是卡特兰数
    我们通常用(h_n)来表示第n个卡特兰数

    同时,卡特兰数满足递推式:
    (h_n={sum^{n-1}_{k=0}h_k*h_{n-1-k}})
    递推式的证明:
    在一个有n+2条边的凸多边形中,我们可以画出n-1条不相交的对角线将多边形分为n个三角形,设所有满足条件的方案数为(h_n)
    考虑凸多边形的任意一条边,我们设为基边,在这条边上的三角形会把这个多边形分成两块,一块邮k+2个边,另一块有n-k+1条边,根据乘法原理,这样的方案数为(h_k*h_{n-1-k}),很明显,k可以从0变化到n-1,则有(h_n={sum^{n-1}_{k=0}h_k*h_{n-1-k}})
    由递推式,加上生成函数的知识,我们能得到(h_n={dfrac{1}{n+1}}*C_{2n}^n)
    但是生成函数,我不会,初赛也用不到。

    应用

    1.括号序列:给出一个用n个计算符合n+1个运算数的算式,要求在算式中任意添加括号,问本质不同的运算顺序有多少种?
    考虑最后一个运算的符号,左边有k个运算符,右边有n-k+1个运算符,很明显满足(h_n={sum^{n-1}_{k=0}h_k*h_{n-1-k}})这份递推式,所以本题的答案是卡特兰数。

    2.有2n个人排队进入稼轩自助餐厅,每人50元,但是这些人n人带着50块,n人带着100块,但是前台没有任何零钱,求有多少种情况无论什么时候都能找开零钱。
    考虑把带50块钱的人看做+1,带一百块钱的人带着-1,只要满足无论什么时候和都大于等于0即可,所以是卡特兰数

    3.一个n*n的网格,从左下走到右上,每次只能向上或向右走,但不能走到左下到右上的对角线的上方,问情况数
    考虑把向右走看做+1,向上走看做-1,因为不能到对角线的上方,所以只要满足无论什么时候和都大于等于0即可,所以是卡特兰数

    我们会发现2、3两题都跟我们证明卡特兰数的通项公式时举的例子非常相近

    4.有n个结点形态不同的二叉树一共有几颗?
    把结点依次按从1到n命名
    对于一个结点,设他的左子树有k个结点,右子树有n-k-1个结点,所以满足卡特兰数

    5.出栈序列统计,有n个数和一个栈,本质不同的合法序列共有多少种?
    把出栈看做-1,进栈看做+1,则很明显有n个+1,n个-1,当栈为空时,就不能再出栈,所以满足无论什么时候和都大于0即可,所以是卡特兰数
    偶然间看到洛谷上有一个例题P1044 栈https://www.luogu.com.cn/problem/P1044



    第二类斯特林数

    前面已经讲过,这里不再赘述

    容斥原理与错位排序

    容斥原理

    ({left|{igcup^n_{i=1}A_i} ight|}={sumlimits^n_{i=1}}{left|{A_i} ight|}-{sumlimits_{i,j,i{ e}j}}{left|{A_i{igcap}A_j} ight|}+{sumlimits_{i,j,k,i{ e}j{ e}k}}{left|{A_i{igcap}A_j{igcap}A_k} ight|}-......+{left|{A_1{igcap}...{igcap}A_n} ight|})
    就是说先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计算时重复计算的数目排斥出去,是的计算的结果既无遗漏又无重复。

    错位排列问题

    利用容斥原理(不然你认为为什么要先讲容斥原理)

    对于一个一到n的任意排列,要求第i个位置上的数不是i,对于任意n,给出错位排列的个数。
    我们设(D_n)为为n时错位排列的个数,(A_i)表示当i这个数在第i个位置的排列的集合,很明显,满足(D_n=n!-{left|{igcup^n_{i=1}A_i} ight|})
    那我们来计算一下({left|{igcup^n_{i=1}A_i} ight|}),利用容斥原理来算
    先算(sum{left|{A_i} ight|}),有一个数固定在其原来位置上,枚举这个数的情况数为(C^1_n)注意是这里组合而不是排列,剩下的就是n-1个数的任意排列,有(A_{n-1}^{n-1}) 种情况,所以总情况数为 (C^1_n*A_{n-1}^{n-1}=n!)
    类比上一种情况,我们很容易能得出(sum{left|{A_i{igcap}A_j} ight|})的值为(C^2_n*A_{n-2}^{n-2}=n!/2),上文所说是组合数的原因是因为令i和j在其原位和令j和i在其原位是一种情况

    一般的,有k个数在固定的位置上,另外(n-k)个数任意排列的结果数为(n!/k!)
    综上,我们可以得到错位排列的公式:(D_n=n!(1-{frac{1}{1!}}+{frac{1}{2!}}-{frac{1}{3!}}+{frac{1}{4!}}+.....+{(-1)}^n*{frac{1}{n!}}))

    现在我们来看一下他的递推式,一共n个数,我们设第1位置的数是k,那就有两种情况来讨论
    1.k位置上的数不是1
    因为1不能在k这个位置,所以不妨设1原来的位置是k,那么其实就是n-1个数的错位排列。
    2.k位置上的数是1
    那这就是n-2个数的错位排列。
    很明显,k可以从2变化到n,所以得到递推式(D_n=(n-1)*(D_{n-1}+D_{n-2}))
    初始值(D_1=0,D_2=1)



    技术技巧——算两次和补集转化

    算两次:

    就是通过两种方法看看的得到的是否是同一个结果以检验结果的正确性,但却不仅仅局限于检验正确性
    例如:
    一颗二叉树中有7个结点有2个儿子,求有多少叶子结点
    设S为二叉树结点总数,而(S_i)表示有i个儿子的结点的个数
    一方面总数为所有结点个数之和:(S=S_0+S_i+S_2)
    另一方面,总数为根节点加儿子数为1的结点的儿子总数和儿子数为2的节点的儿子总数,即:
    (S=1+S_1+2*S_2)
    所以我们能得到(S_2+1=S_0)

    补集转化

    其实就是迂回求解,用总共的情况数减去我们所要求解的补集,剩余的就是我们所要求解的。上文在求解卡特兰数时用到了这种思想。



    鸽巢原理

    简单来说,若有n个笼子,n+1只鸽子,则至少有一个笼子里有2只鸽子

    简单应用:

    一位国际象棋大师有11周的时间备战一场锦标赛,他决定每天至少下一盘棋,但每周下棋不能超过12盘,请证明连续若干天,这位大师恰好下了21盘棋

    我们设(a_i)为他前i天所下的棋的总和,因为每天下一盘棋,所以(a_1...a_77)是一个递增的序列,且(a_1{ge}1),又因为 每周最多下棋12盘,所以(a_77{le}12*11=132)
    所以能得到1式(1{le}a_1<a_2<a_3<......a_77{le}132)
    显然2式(22{le}a_1+21<a_2+21<a_3+21<......a_77+21{le}153)也是满足的。
    于是我们有(1{le}a_1<a_2<a_3<......a_77+21{le}153)
    很显然,(a_1,a_2,a_3......a_77,a_1+21,a_2+21......a_77+21)一共有154个数,且都是整数,由他们都大于等于1,小于等于153和鸽巢原理可以得到,中间有两个是相等的,且必定是(a_i)(a_j+21)相等,因为我们得到的1、2式都是单调递增的,在他们自己内部不可能相等。并且,i必须大于等于j,因为(a_i)一定大于(a_j),所以在j到i这些天中,他一共下了21盘棋。

    NOIP2010提高组:
    记T为一个队列,初始时为空,现在有n个总和不超过32的正整数依次入列。如果无论这些数具体为何值,都能找到一种出队的方式,是的T中存在某个时刻T中的数之和恰好为9,求n的最小值。
    我们设(S_i)为前i个数的和。接下来我会列几个关于S的集合:
    1:0,9,18,27
    2:1,10,19,28
    3:2,11,20,29
    4:3,12,15,24
    5:4,13,22,31
    6:5,14,23,32
    7:6,15,24
    8:7,16,25
    9:8,17,26
    这里一共有9个集合,因为我们要求最小的n使得无论如何一定会出现和为9的情况,那么我们就直接看最坏情况,很明显,这个关于S的许多集合,每个集合都不能取相邻的数,那么每一个集合都最多取两个数,即18个数,再这种情况下我们在取一个数,势必会造成有两个数相邻,所以19是正确答案。



    Nim取石子问题:

    先讲个简单点的,目前一共有n个石子,两个人每人能取1至m个,不能不取,谁先取完谁赢。
    我们很容易得到,谁先取到第n-m-1个石子谁必胜。因为这时剩下m+1个石子,无论怎么取,这时先取得人必败。
    我们一直往前推,如果满足(n=k(m+1)+r) 那么这时先手先取r个,对面取q个咱们就取m+1-q个,这样保证你我二人取得总和剩下m+1个,这样到最后你一定会面对只剩m+1个石子的窘况,但是如果r=0,那我就会面对m+1的窘况。因此我们可以得到,若(n%(m+1)==0)则先手必败,否则先手必胜。

    这是一堆石子,但是若是很多个石子怎么办呢?我推荐下面这个视频:https://www.bilibili.com/video/BV1ek4y1q7JD/?spm_id_from=333.788.videocard.1
    因此,只要看是否为平衡态即可,若开始状态是平衡态,则先手必败,否则先手必胜



    最少任意交换次数:一次到位!或者n-置换环个数

    最少相邻交换次数:逆序对的个数

    noip初赛题目

    2018年:从 1 到 2018 这 2018 个数中,共有__________个包含数字 8 的数。
    我们这样来思考这个问题:从1到10,有1个数带8
    从10到99,各位为8十位不为8时应共有9*1个,十位为8个位不为8时的数共有9个,共有18个
    从100到999,后两位数出现8的个数一共有19种情况,这时百位可以从1变化到9,所以百位不为8后两位出现8的个数共有8*19共有152种,而百位为8的个数为100个,共有252种
    所以从1000到1999共有252+18+1等于271种
    所以从1到1999共有542种,从2000到2018共有2个数带8,所以从1到2018共有544个数

    2017年:
    21. 找规律
    22. 多试几下

    2016:
    21.从一个 4×4 的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格,共有_______种方法。
    我们利用容斥原理:
    总的情况数是(C^2_{4*4}),在一条线上的情况数如下:第一个格子可以取的情况为(A^1_16),第二个格子取的情况为(A^1_6),运用乘法原理,得到最后结果为(C^2_{4*4}-A^1_{16}*A^1_6)总情况数72,这个题主要注意两个格子没有区别
    或者直接第一个格子情况数为(A^1_{4*4}),第二个格子情况数为(A^1_9),但是别忘了,两个格子是一样的,互相有重复。

  • 相关阅读:
    【3】jQuery学习——入门jQuery选择器之基本选择器
    对于转载引发的问题没见过这样强硬的论坛
    SQL2进制问题
    用SQL只获取日期的方法
    C#算法求2进制的问题
    ASP.NET Ajax In Action!读书笔记1
    Fckeditor配置
    MIME types list
    SQL case when then else end运用
    ASP.Net访问母版页(MasterPage)控件、属性、方法及母版页中调用内容页的方法
  • 原文地址:https://www.cnblogs.com/TianMeng-hyl/p/13719912.html
Copyright © 2011-2022 走看看