zoukankan      html  css  js  c++  java
  • P2817 宋荣子的城堡

    P2817 宋荣子的城堡
    一道找规律的题,现在深入追究发现了有趣的东西。
    1 1
    2 2
    3 9
    4 64
    显然k^(k-1) 在日照的时候也推出来了。
    3 9今天推错了,要列出所有的情况,然后再选,否则会漏掉。
    答案是(k^(k-1)) * ((n-k)^(n-k))
    对了,我卡速米一直打的是错的。要对指数为0的情况特判,不然会死循环。

    现在,告诉我,why?

    cayley定理(凯莱定理)
    对于有n个节点,生成树的方案有多少种?
    答案是n^(n-2)
    推导过程如下:
    k表示现在有多少子树
    显然初始时,k==n
    现在从n个节点中任选1个,有C(n 1)种可能,再从不包含这个节点的子树中选1个子树和这个节点连起来,有C(k-1 1),然后子树减少一个。重复这个过程直到,子树只剩1个,乘法原理,(n^(n-1))*(n-1)!。
    假定每次都是(从n个节点中任选1个)选的同一个,并把它设成根,想象一下,对于同一棵树这就考虑了每个节点是根的情况。
    有n-1条边,不考虑加进来的顺序,所以再除(n-1)!,现在成了n^(n-1),在一棵树中,根节点是哪个都无所谓,再除n,就成了
    n^(n-2)。

    但是对于这个题而言,可以假定1连向的点为根节点,实际上把它的每个点当成根节点都会形成新的方案,所以再*k
    故答案 k^(k-1)

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<ctime>
     7 #include<cstring>
     8 #define mod 1000000007
     9 #define inf 2147483647
    10 #define For(i,a,b) for(register long long i=a;i<=b;i++)
    11 #define p(a) putchar(a)
    12 #define g() getchar()
    13 //by war
    14 //2017.10.19
    15 using namespace std;
    16 long long n,k;
    17 void in(long long &x)
    18 {
    19     long long y=1;
    20     char c=g();x=0;
    21     while(c<'0'||c>'9')
    22     {
    23     if(c=='-')
    24     y=-1;
    25     c=g();
    26     }
    27     while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
    28     x*=y;
    29 }
    30 void o(long long x)
    31 {
    32     if(x<0)
    33     {
    34         p('-');
    35         x=-x;
    36     }
    37     if(x>9)o(x/10);
    38     p(x%10+'0');
    39 }
    40 
    41 long long POW(long long a,long long b)
    42 {
    43     a%=mod;
    44     if(b==0)
    45     return 1;
    46     while(b%2==0)
    47     {
    48         a=(a*a)%mod;
    49         b>>=1;
    50     }
    51     long long r=1;
    52     while(b>0)
    53     {
    54         if(b%2==1)
    55         r=(r*a)%mod;
    56         a=(a*a)%mod;
    57         b>>=1;
    58     }
    59     return r;
    60 }
    61 
    62 int main()
    63 {
    64     in(n),in(k);
    65 //    n%=mod; 
    66     o((POW(k,k-1)*POW(n-k,n-k))%mod);
    67      return 0;
    68 }
    View Code
  • 相关阅读:
    Vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。
    Java中数组复制的几种方法
    Java类的执行顺序
    JVM——代空间的划分
    JVM——垃圾收集器
    Java异常体系结构
    设计模式——单例模式
    Java多线程系列——原子类的实现(CAS算法)
    乐观锁与悲观锁
    Java中Volatile关键字详解
  • 原文地址:https://www.cnblogs.com/war1111/p/7695151.html
Copyright © 2011-2022 走看看