樹(4月7日題目 dfs序 數論 排列組合)

2021-10-04 20:37:56 字數 2442 閱讀 9570

題目描述

shy有一顆樹,樹有 n

nn 個結點。有 k

kk 種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 (x,

y)

(x,y)

(x,y),x

xx 到 y

yy 的路徑上的所有點的顏色都要與 x

xx 和 y

yy 相同。請統計方案數。

輸入描述:

第一行兩個整數 n

nn,k

kk 代表點數和顏色數;

接下來 n−1

n-1n−

1 行,每行兩個整數 x,y

x,yx,

y 表示 x

xx 與 y

yy 之間存在一條邊;

輸出描述:

輸出乙個整數表示方案數 (mo

d1e9

+7

)(mod \ 1e9+7)

(mod1e

9+7)

示例1

輸入

4 31 2

2 32 4

輸出

39備註:

對於 30

%30\%

30% 的資料,n≤10

,k≤3

n≤10, k≤3

n≤10,k

≤3;對於 100

%100\%

100%

的資料,n,k

≤300

n,k≤300

n,k≤30

0。思路:

這道題可以轉化成一道排列組合的問題,將這棵樹分成不超過 k

kk 個連通塊,每個連通塊圖塗不同的顏色。若將一棵樹分成 i

ii 個連通塊,那麼要刪去 i−1

i-1i−

1 條邊,方案數為 cn−

1i−1

\mathrm_^

cn−1i−

1​,然後從 k

kk 種顏色中選 i

ii 種染色,方案數為 aki

\mathrm_^

aki​

。所以,總的方案數就是 ∑i=

1min

(n,k

)cn−

1i−1

ak

i\sum_^\mathrm_^\mathrm_^

∑i=1mi

n(n,

k)​c

n−1i

−1​a

ki​。

code:

#include

using

namespace std;

typedef

long

long ll;

const ll mod =

1e9+7;

const

int n =

310;

ll n, k, ans, fac[n]

, inv[n]

;ll c

(ll a, ll b)

ll a

(ll a, ll b)

intmain()

for(ll i =

2; i <=

max(n, k)

; i++

)for

(ll i =

1; i <=

min(n, k)

; i++

) cout << ans << endl;

return0;

}

code2:

#include

using

namespace std;

typedef

long

long ll;

const ll mod =

1e9+7;

const

int n =

310;

ll n, k, ans, fac[n]

;ll qpow

(ll a, ll b)

return res % mod;

}ll inv

(ll a, ll p)

ll c

(ll a, ll b)

ll a

(ll a, ll b)

intmain()

for(ll i =

1; i <=

min(n, k)

; i++

) cout << ans << endl;

return0;

}

每日一題 4月7日題目精講 樹

樹 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k 其他語言262144k 64bit io format lld 題目描述 shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色...

每日一題 4月8日題目精講 黑白樹

試題鏈結 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 題目描述 一棵n個點的有根樹,1號點為根,相鄰的兩個節點之間的距離為1。樹上每個節點i對應乙個值k i 每個點都有乙個顏色,初始的時候所有點都是白色的。你需要...

JZOJ7月15日提高組T4 排列統計

題解對於給定的乙個長度為n的序列,問有多少個序列對於所有的i滿足 a 1 a i 這i個數字中有恰好b i 個數字小等於i。其中為1 n的乙個排列,即1 n這n個數字在序列a i 中恰好出現一次。資料保證了至少有乙個排列滿足b序列。輸入的第1行為乙個正整數n,表示了序列的長度。第2行包含n個非負整數...