BZOJ4766 文藝計算姬(生成樹)(公式題)

2021-07-28 14:47:53 字數 1457 閱讀 2107

時間限制:1秒  記憶體限制:128m
【問題描述】

給定乙個一邊點數為n,另一邊點數為m,共有n*m條邊的帶標號完全二分圖,請計算其生成樹個數。

【輸入格式】

僅一行三個整數n,m,p,表示給出的完全二分圖k_。

【輸出格式】

僅一行乙個整數,表示完全二分圖k_的生成樹個數,答案需要模p。

【輸入樣例】

2 3 7

【輸出樣例】

【資料範圍】

20%的資料:n*m <= 20

另有10%的資料:n=2

另有20%的資料:n=3 , m<=10^6

另有20%的資料:n=4

100%的資料:1 <= n,m,p <= 10^18

【**】

bzoj4766

這道題的部份分**可以各種暴力,n小的還可以按n分類來處理。

但當打了乙個暴力之後你看到最後的資料範圍,很明顯這是一道公式題,不知道公式的我們又3種路可以走:

1.放棄後面的分,做其他題。

2.自己推公式,用人腦來處理問題,拼的就是數學功底。

3.既然已經有了乙個暴力,那我們就出幾組暴力的資料和答案出來,開動我們的腦洞,找規律就開了。(只用於公式簡單的,不然你會瘋的)

而對於這道題我就用的第3個辦法,暴力不說了,列舉每條邊要不要,最有看生成的是不是樹就可以了,最暴力的那種(保證不錯)。

接下來就是找規律了,記住打死不能取模,取模了你找到的都是浮雲了。

亂算一通發現(n^(m-1))*(m^(n-1))滿足所以資料。

試著打了個**fc了一波發現確實一樣就ac了。

要證明這個公式我們可以用矩陣樹定理或者prufer序列。

因為每個prufer序列都對應了一棵唯一的樹,而每棵樹都對應唯一的prufer序列。所以我們只要求有多少序列就可以了。

但當你仔細看資料會發現longlong根本不夠用!高精度?我們可以用2分快速加(自己亂取的名字),反正就是把乘法轉換成加法,然後像乘法一樣用倍增的方法快速加,這樣就不用打高精度了,雖然速度要乘以log2(n)但我們比較用的公式時間都可以忽略不計的。

詳細**如下:

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn=50;

ll n,m,mod;

ll add(ll a,ll b)

return c;

}ll work()

t=n-1,x=m;

while(t)

return add(b,c);

}int main()

bzoj4766 文藝計算姬

求乙個完全二分圖的生成樹個數 構造基爾霍夫矩陣的余子式,發現是這樣的 先用上面n 1行每一行都去加第n行。然後第n行變成n 1個m 1然後乙個1再來m 1個1 n 用下面m 1行每一行都去加第n行。然後第n行變成只有後m個位置是1。用第n行去加前n 1行,就把那堆 1消掉了。然後變成下三角矩陣,行列...

bzoj4766 文藝計算姬

今天七道題 5 7 定理,完全二分圖生成樹的個數是 nm 1mn 1然後就沒有然後了 聽說現場的很多大佬都是打了張表然後一行一行看出來的。好厲害啊我也學會了。結論題 include include define ll unsigned long long using namespace std ll...

BZOJ 4766 文藝計算姬

傳送門 題目描述 奮戰三星期,造台計算機 小 w 響應號召,花了三星期造了臺文藝計算姬。文藝計算姬比普通計算機有更多的藝術細胞。普通計算機能計算乙個帶標號完全圖的生成樹個數,而文藝計算姬能計算乙個帶標號完全二分圖的生成樹個數。更具體地,給定乙個一邊點數為 n nn,另一邊點數為 m mm,共有 n ...