zoukankan      html  css  js  c++  java
  • Stack [NOIP模拟] [组合数学经典]

    Description
    栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两种: push 和 pop ,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1 ,2 ,... ,n,经过一系列操作可能得到的输出序列总数 mod 7 的值。
    Input
    一个整数n。
    Output
    一个数,即可能输出序列的总数目。

    Sample Input
    3

    Sample Onput
    5

    Data Range
    n<=1000
    Solution

    这是一个经典的组合数学的模型,可以从两个角度来思考。

    第一:这是卡特兰数,直接通过卡特兰数的递推公式推导而来。

    第二:从格路数的角度思考,这就是从坐标原点不穿越y=x这条直线到(n,n)点的最短路径方案数

    即C(2n,n)-C(2n,n-1)。

    推导过程:不穿越y=x等价为不碰触y=x-1,即为所有不合法的方案为(0,0)以y=x-1的对称点(1,-1)到(n,n)的方案(一一对应原理)

    再用合法方案减去不合法方案即为答案(没看懂的可以参考 《组合数学》卢开澄 清华大学出版社 第一章的解释)

    最后递推组合数相减要注意避免出现负数,可以(C(2n,n)-C(2n,n-1)+14) mod 7

  • 相关阅读:
    单例模式 2中创建方法
    Interger 与 int
    java equals 和 "==" 比较
    java 小知识点
    对象复制、克隆、深度clone
    onsubmit="return false;"报错
    js 在myeclipse中报错
    struts2 标签 --<<s:url >
    struts2 标签问题----日期显示
    mysql 建表语句
  • 原文地址:https://www.cnblogs.com/ibilllee/p/7686637.html
Copyright © 2011-2022 走看看