傳送門
容斥原理
把三個容斥套一起
我們列舉至少有i
ii行沒有染色,至少j
jj列沒有染色,至少k
kk種顏色沒有用到,那麼剩下(n−
i)(m
−j
)(n-i)(m-j)
(n−i)(
m−j)
個格仔每個都有c+1
−k
c+1-k
c+1−
k種選擇(可以在剩下c−k
c-kc−
k種顏色中挑一種,也可以不染色),因此答案就是
∑ i=
0n∑j
=0m∑
k=0c
(−1)
i+j+
kcni
cmjc
ck(c
+1−k
)(n−
i)(m
−j
)\sum\limits_^n\sum\limits_^m\sum\limits_^c(-1)^c_n^ic_m^jc_c^k(c+1-k)^
i=0∑n
j=0∑
mk=
0∑c
(−1)
i+j+
kcni
cmj
cck
(c+
1−k)
(n−i
)(m−
j)先列舉k
kk,o(n
m)
o(nm)
o(nm
)預處理(c+
1−k)
(c+1-k)
(c+1−k
)的冪,再列舉i
ii和j
jj計算答案,總複雜度o(n
mc
)o(nmc)
o(nmc)
。組合數一開始用楊輝三角預處理即可,因為資料範圍很小。
#include
#include
#include
#include
template
<
typename t>
inline
void
read
(t& x)
template
<
typename t,
typename..
. args>
inline
void
read
(t& x, args&..
. args)
template
<
typename t>
void
write
(t x)
template
<
typename t>
inline
void
writeln
(t x)
template
<
typename t>
inline
bool
chkmin
(t& x,
const t& y)
template
<
typename t>
inline
bool
chkmax
(t& x,
const t& y)
typedef
long
long ll;
const
int maxn =
402;
const ll mod =
1e9+7;
ll c[maxn]
[maxn]
;ll p[maxn * maxn]
;int n, m, c, mx;
inline
void
init_pow
(int x)
inline
void
init_c()
intmain()
}writeln
(ans)
;return0;
}
題解 JSOI2015染色問題
好像這個容斥還是明顯的。一共有三個要求,可以用組合數先滿足乙個,再用容斥解決剩下的兩個維。反正這題資料範圍這麼小,隨便亂搞都可以 用 a k i 表示使用 k 種顏色,至少有 i 列沒有染色的方案數,可以容斥預處理得到使用 k 種顏色染色使得每行每列均被染色的方案數。然後再容斥一下保證每種顏色都用上...
JSOI2015 染色問題
傳送門 雖然不是第一反應,不過還是想到了要容斥。題意轉化 需要求滿足 n m c 個條件的方案數。然後我們就列舉三個數 i,j,k 表示當前方案中,至少不用 k 種顏色,至少不塗 i 行 至少不塗 j 列。然後直接組合數算 式子不難看懂 最後容斥即可。那麼寫出來就是 ans sum n sum m ...
題解 JSOI2015 圈地
發現一種地要麼歸 a 要麼歸 b 若相鄰兩塊歸屬不同還有額外代價 那麼 a 買就連源點,b 買就連匯點 總收益加上這些值 中間連代價的雙向邊 答案為總收益減去最小割 include include include include include include const int n 160005 ...