zoukankan      html  css  js  c++  java
  • cojs QAQ的图论题 题解报告

    话说这个题目应该叫做 斯特林数的逆袭 QAQ

    先说一说部分分的算法

    1、n<=5 直接暴力搜索就可以了

    2、k=0的时候不难发现任意一张图的价值都是n,问题转化为计算有多少种图,显然是2^C(n,2)

    3、k=1的时候不难发现任意一张图的价值都是其度数的和,暴力1->10的n不难发现规律QAQ

    4、实际上3的算法的规律会启发我们想到这个算法,不难发现每个点的度数的贡献都是独立的

    不妨每一个点度数恰好为i的方案数并且计算贡献就可以了QAQ

    当前点度数为i,则显然他要向i个点连边,可连边的点一共有(n-1)个

    其余(n-1)个点之间随意连边

    不难得到贡献为C(n-1,i)*i^k*2^C(n-1,2)

    然后考虑每个点实际上都是等价的,可以得到ans=sigma(C(n-1,i)*i^k)*n*2^C(n-1,2)

    然后预处理阶乘和阶乘的逆元,可以在O(n)时间内计算答案

    这样加起来就有50分辣

    5、我们考虑这个式子是否可以化简

    注意到i^k=sigma(S(k,j)*j!*C(i,j))

    从组合数学的角度理解就是i^k实际上是在i个数中可重选取k个数的方案

    我们考虑选取的这k个数都是哪些数,不妨枚举j

    那么把k个数分给j个集合就是第二类斯特林数,集合有序所以乘以j!

    最后乘以在i个数中选取j个数的方案C(i,j)就可以得到这个式子

    之后展开式子,把C(n-1,i)和C(i,j)*j!合并可以得到

    ans=sigma((S(k,j)*(n-1)*(n-2)……*(n-j)*sigma(C(n-j-1,i-j))*n*2^C(n-1,2)

    不难发现sigma(C(n-j-1,i-j))=2^(n-j-1)

    所以计算这个式子我们只需要枚举j就可以了,我们会惊奇的发现这样时间复杂度是O(k)的

    然后暴力计算斯特林数的时间复杂度是O(k^2)

    总时间复杂度O(k^2),这样结合前面的算法就有70分了

    6、考虑时间复杂度的瓶颈在于计算斯特林数

    而我们实际上只是求第k行的斯特林数就可以了

    我们知道斯特林数的通项公式是

    S(n,m)=1/m!*sigma((-1)^k*C(m,k)*(m-k)^n)

    从容斥的角度解释的话我们会发现我们有m个盒子,n个元素

    可以有空盒的方案实际上是m^n

    考虑到条件是不可以有空盒所以我们可以利用容斥原理

    枚举至少有k个空盒,其余的盒子任意装,方案为C(m,k)*(m-k)^n

    然后套上容斥系数就可以了,注意这里的盒子是无序的,所以我们最后还要消序QAQ

    不难发现这个式子是一个卷积形式,我们利用这个式子构造多项式并做FFT

    就可以在O(klogk)的时间内求出第k行的所有斯特林数了

    时间复杂度O(klogk) QAQ 这样我们就圆满的解决这道题目了

  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/joyouth/p/5599564.html
Copyright © 2011-2022 走看看