題目描述
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
−1a
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個非負整數...