zoukankan      html  css  js  c++  java
  • 「Luogu4430」小猴打架

    「Luogu4430」小猴打架

    problem

    题目描述

    一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友。每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友。经过N-1次打架之后,整个森林的小猴都会成为好朋友。 现在的问题是,总共有多少种不同的打架过程。 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1-2}{2-3,1-3}六种不同的打架过程。

    输入输出格式

    输入格式:

    一个整数N。

    输出格式:

    一行,方案数mod 9999991。

    输入输出样例

    输入样例#1

    4
    

    输出样例#1

    96
    

    说明

    50%的数据N<=10^3。 100%的数据N<=10^6。

    Code

    #include <cstdio>
    using namespace std;
    typedef long long ll;
    
    const ll mod=9999991;
    int n;
    ll ans=1;
    
    int main()
    {
    	scanf("%d",&n);
    	for(register int i=1;i<=n-2;++i)ans=ans*n%mod;
    	for(register int i=1;i<=n-1;++i)ans=ans*i%mod;
    	printf("%lld",ans);
    	return 0;
    }
    

    ...

    ???

    Solution

    题目等价于求一个有(n)个节点的完全图的生成树的方案有多少个

    两个方案不同当且仅当生成树中有至少一条边不同,或者生成树相同,而加边的顺序不同

    前置知识:
    Cayley公式:对于一个有(n)个节点的完全图(G),它的生成树个数有(n^{n-2})

    证明需要用到prufer编码,其实matrix-tree定理也可以证明

    下面是两篇分别通过prufer编码和matrix-tree定理证明Cayley的博客:
    经典证明:Prüfer编码与Cayley公式
    题解 P4430 【小猴打架】

    然后是这道题,对于每棵生成树,有((n-1)!)种顺序将边加入生成树中,所以还要乘上去

  • 相关阅读:
    安装centos出现的问题
    linux学习笔记
    sails框架结合mocha的测试环境搭建
    sails框架结合mocha
    使用postman发送http请求
    C++之易混淆知识点三---算法分析
    复习一下单链表的常用操作
    C++之易混淆知识点二
    FPGA之阻塞赋值与非阻塞赋值
    C++之易混淆知识点一-----static详解
  • 原文地址:https://www.cnblogs.com/lizbaka/p/10295542.html
Copyright © 2011-2022 走看看