• 组合数的奇偶性


    组合数可以表示为

    [C^m_n = frac{n!}{m!(n-m)!} ]

    假设(n!,m!,(n-m)!)含因子(2)的个数分别为(A,B,C)
    则当(A=B+C)时,(C^m_n)为奇数

    那么如何求出(n!)的因子个数呢?
    对于一个质数(p)
    它的倍数(k*p^i)含因子(p)的个数为即为(i(k=1,2,3...))
    于是只要求出(n!)中所有的(k*p^i)即可,
    (n!)含因子(p)的个数为

    [lfloor frac{n}{p} + frac{n}{p^2} + frac{n}{p^3} + frac{n}{p^4} + ... floor ]

    所以(n!)含因子(2)的个数为

    [f(n) = lfloor frac{n}{2} + frac{n}{2^2} + frac{n}{2^3} + frac{n}{2^4} + ... floor ]

    其中,可以将(n)表示为二进制拆分的形式:

    [n = (a_1*2^0)+ (a_2*2^1)+ (a_3*2^2)+ (a_4*2^3)+... ]

    (f(n))就可以表示成

    [f(n) = sum limits_{j=1}^{k} frac{(a_1*2^0)+(a_2*2^1)+...+ (a_k*2^{k-1})}{2^j} ]

    将式子简化

    [= sum limits_{j=1}^{k} frac{(a_{j-1}*2^j)+...+ (a_k*2^{k-1})}{2^j} ]

    [= sum limits_{j=1}^{k} sum limits_{i=j+1}^{k} frac{a_{i}*2^{i-1}}{2^j} ]

    [= sumlimits_{i=1}^{k} a_i sumlimits_{j=1}^{i-1} frac{2^{i-1}}{2^j} ]

    [= sumlimits_{i=1}^{k} a_i sumlimits_{j=0}^{i-2} 2^j ]

    [= sumlimits_{i=1}^{k} a_i * (2^{i-1} - 1) ]

    [= sumlimits_{i=1}^{k} a_i * 2^{i-1} - sumlimits_{i=1}^{k} a_i ]

    [= n - sumlimits_{i=1}^{k} a_i ]

    观察这个式子,可以发现

    [sumlimits_{i=1}^{k} a_i = n在二进制下1的个数 ]

    (n,m,(n-m))在二进制下(1)的数目分别为(a,b,c)
    要满足(A=B+C),则:

    [n−a=m−b+(n−m)−c ]

    [a=b+c ]

    要满足这个条件则有

    [(n&m) == m ]

  • 相关阅读:
    odoo 成长之路
    程序人生之项目汇报(吐槽篇)
    docker-compose介绍及使用
    XML-RPC入门
    编辑器之神-vim
    Linux基本命令 三、系统管理
    基于socketserver模块实现并发的套接字(tcp、udp)
    第6章-3.使用函数统计指定数字的个数 (20分)
    第6章-2.使用函数求素数和 (20分)
    第6章-1.使用函数求特殊a串数列和 (10分)
  • 原文地址:https://www.cnblogs.com/mogeko/p/15402981.html
Copyright © 2020-2023  润新知