傳送門
前話:太菜了太菜了,想到了容斥,以為很複雜就沒寫
思路:容斥原理。
令集合sri
s_sr
i表示棋子不在第i
ii行的方案數,同理sci
s_sc
i表示棋子不在第i
ii列的方案數。
根據容斥原理有:
a ns
=∣sr
1‾∩s
rn‾∩
sc1‾
∩scm
‾∣=t
ot−∣
sr1∪
srn∪
sc1∪
scm∣
ans\\=|\overline}\cap\overline}\cap\overline}\cap\overline}|\\=tot-|s_\cup s_\cup s_\cup s_|
ans=∣s
r1
∩sr
n
∩sc1
∩
scm
∣=
tot−
∣sr1
∪s
rn
∪sc1
∪s
cm
∣ 顯然可以用位運算實現,因為只有4個集合,直接手動判斷即可。
我們令第0,1
,2,3
0,1,2,3
0,1,2,
3位分別表示是否並上r1,
rn,c
1,cn
r_1,r_n,c_1,c_n
r1,rn
,c1
,cn
。沒有並上對應的r−−
,c−−
r--,c--
r−−,c−
−。顯然總共有c40
+c41
+c42
+c43
+c44
=(1+
1)4=
16c_4^0+c_4^1+c_4^2+c_4^3+c_4^4=(1+1)^4=16
c40+c
41+
c42
+c43
+c4
4=(
1+1)
4=16
種。然後判斷一下是加還是減即可,如果是奇數個並就是減,否則為加。
即該情況貢獻為(−1
)cnt
×c(r
′×c′
,k
)(-1)^\times c(r'\times c',k)
(−1)cn
t×c(
r′×c
′,k)
至於組合數就用遞推或者費馬小定理搞一下就行了。
typedef
long
long ll;
const
int mod=
1e9+7;
class
solution
intsolve
(int n,
int m,
int k)
return
(ans+mod)
%mod;}}
;
費馬小定理acac
ac**:
typedef
long
long ll;
const
int mod=
1e9+7;
class
solution
ll ksm
(ll a,ll n)
return ans;
} ll c
(ll n,ll m)
intsolve
(int n,
int m,
int k)
};
挖坑:怎麼求必須在前x
xx行,後x
xx行,前x
xx列,後x
xx列都有棋子的方案數。
容斥原理 數論
兩個集合的容斥關係公式 a b a b a b a b 重合的部分 三個集合的容斥關係公式 a b c a b c a b b c c a a b c 最後可以推廣到n個集合,集合裡的元素為奇數則加,偶數減 hdu 4135 很簡單,直接求出所有的質因子,然後容斥解決 author crystal ...
容斥原理,反演
大概知道為什麼自己水平比較渣啦。一開始只會反演,然後被容斥驚豔到。然後寫了一段時間容斥,反演忘光光。所以融會貫通真的很難。多校的三道題,當時是用反演做的。事實上以前就知道容斥跟莫比烏斯函式值的關係,然後熟練掌握 然後一段時間沒用就忘了哈。簡單來說就是,求乙個數和乙個集合中的數互質的個數,把集合中乙個...
關於容斥原理
容斥原理大概是這樣的,以長方體體積並為例,我們需要用容斥原理容斥出若干個長方體體積的並.首先,我們將每個長方體標號為1 n,那麼這些長方體的取捨顯然可以表示為乙個二進位制的數字s.設f s 表示長方體取捨狀態為s時,長方體的體積並,於是我們可以知道f 111111 有n個1 就是我們最終的所求.好,...