• [Prufer序列] Bzoj P4766 文艺计算姬


    Description

    "奋战三星期,造台计算机"。小W响应号召,花了三星期造了台文艺计算姬。文艺计算姬比普通计算机有更多的艺
    术细胞。普通计算机能计算一个带标号完全图的生成树个数,而文艺计算姬能计算一个带标号完全二分图的生成树
    个数。更具体地,给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图K_{n,m},计算姬能快
    速算出其生成树个数。小W不知道计算姬算的对不对,你能帮助他吗?

    Input

    仅一行三个整数n,m,p,表示给出的完全二分图K_{n,m}
    1 <= n,m,p <= 10^18

    Output

    仅一行一个整数,表示完全二分图K_{n,m}的生成树个数,答案需要模p。

    Sample Input

    2 3 7

    Sample Output

    5

    题解

    • 我们考虑用prufer序列建树的过程,最后是剩下一条边两个点,那么这两个点显然分别是在二分图的两侧的
    • 而删除时会将当时与被删除点有边的点加入prufer序列中
    • 那根据二分图的性质(连边只在不同集合点之间)
    • A集合中的点被加进prufer序列中m-1次,B集合中的点被加进n-1次
    • 则生成树个数为[n^(m-1)]*[m^(n-1)]
    • 注意要打快速乘

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #define ll long long
     4 using namespace std;
     5 ll n,m,p,r;
     6 ll mul(ll x,ll y) { return (x*y-(ll)(((long double)x*y+0.5)/(long double)p)*p+p)%p; }
     7 ll ksm(ll a,ll b) { for (r=1;b;b>>=1,a=mul(a,a)) if (b&1) r=mul(r,a); return r; }
     8 int main()
     9 {
    10     scanf("%lld%lld%lld",&n,&m,&p),printf("%lld",mul(ksm(n,m-1),ksm(m,n-1)));
    11 }
  • 相关阅读:
    Leetcode Reverse Words in a String
    topcoder SRM 619 DIV2 GoodCompanyDivTwo
    topcoder SRM 618 DIV2 MovingRooksDiv2
    topcoder SRM 618 DIV2 WritingWords
    topcoder SRM 618 DIV2 LongWordsDiv2
    Zepto Code Rush 2014 A. Feed with Candy
    Zepto Code Rush 2014 B
    Codeforces Round #245 (Div. 2) B
    Codeforces Round #245 (Div. 2) A
    Codeforces Round #247 (Div. 2) B
  • 原文地址:https://www.cnblogs.com/Comfortable/p/11145357.html
Copyright © 2020-2023  润新知