zoukankan      html  css  js  c++  java
  • 关于 计数题 的一些认识

    爱数数的人上大学了,所以计数题就多了

    建议先练习好小球与盒子的计数

    (CSP) 前学会求组合数的多种方法,(O(n^2)) 求斯特林数。

    省选前学好 (NTT)

    计数题首先要知道怎么判断不同,一般都很显然,不显然的话题目里应该也会说。

    有的时候需要找找性质,转化一下等价的判别不同的方法。

    通常会使用 (DP) 求解,把会造成不同的情况放到数组的,然后考虑不同之间的转移。

    经常用到的东西:组合数,斯特林数,NTT等。

    组合数

    组合数可以用杨辉三角 (n^2) 递推来求,不用考虑模数是否是质数。

    当模数是大质数(不会用到大于等于mod的数的阶乘)的时候,可以预处理阶乘及其逆元,然后 (O(1)) 来求。

    如果是小质数,可以先预处理小于mod的数的阶乘,然后考虑卢卡斯定理。

    如果出题人很毒瘤,模数不是质数,但质因数分解后每个质数的指数都是1,就可以考虑用上边的方法对分解出来的指数求解,然后用中国剩余定理合并答案。例子

    如果出题人更毒瘤,模数不是质数,质因数分解后每个质数的指数不一定都是1,那么可以考虑扩展卢卡斯。

    斯特林数

    分第一类和第二类。常用到第二类,也是小球与盒子的模型的一种。

    可以用 (n^2) 递推,不用考虑模数是否是质数。

    当模数是 (NTT) 模数的时候,可以用 (NTT) 来求,但通常只用来求第二类斯特林数·行,由 (O(n^2)) 变成了 (O(nlogn))

    NTT

    常用来优化卷积,有的时候还会用到分治 (NTT) ,分两种,一种是洛谷模板,另一种是多个小多项式合并

    错排

    (ans[i])(i) 个数的错排问题。

    那么考虑第 (i) 放在 (j) 的位置,一共有 (i-1) 种选择。

    如果 (j) 放在了 (i) 的位置,那么问题规模缩小 (2) ,有 (ans[i-2]) 种方案。

    否则剩下的 (i-1) 个数都有一个不能放的位置,有 (ans[i-1]) 种方案。

    所以 (ans[i]= (i-1) imes (ans[i-1]+ans[i-2]))

    实在不会的话可以直接背

    卡特兰数

    有一些神奇的性质。

    求法一:(displaystyle f[n]=sum_{i=0}^{n-1}f[i] imes f[n-i-1])

    求法二:(displaystyle f[n]=frac{C_{2n}^{n}}{n+1})

    应用:括号计数,出栈次序,凸多边形三角划分,二叉搜索树计数。

    其他

    n个点的无根树有 (n^{n-2}) 种,有根数有 (n^{n-1}) 种,证明需要学习prufer序列的相关知识

  • 相关阅读:
    [总结]FFMPEG视音频编解码零基础学习方法--转
    ffmpeg中swscale 的用法
    FFmpeg解码H264及swscale缩放详解
    C++: std::string 与 Unicode 如何结合?
    SpringBoot-@RequestParam
    SpringBoot --web 应用开发之文件上传
    Java并发编程:线程池的使用
    Executor线程池的最佳线程数量计算
    并发下线程池的最佳数量计算
    根据CPU核心数确定线程池并发线程数
  • 原文地址:https://www.cnblogs.com/wljss/p/13127253.html
Copyright © 2011-2022 走看看