比賽
有乙個n*m的棋盤,初始每個格仔都是白色的。
行或列操作是指選定某一行或列,將這行或列所有格仔的顏色取反(黑白互換)。
進行r次行操作c次列操作(可能對某行或者某列操作了多次),最後棋盤上有s個黑色格仔。
問有多少種不同的操作方案。兩種操作方案不同,當且僅當對某行或者某列操作次數不同(也就是說與操作的順序無關)。求方案數mod
109+
7\mod 10^9+7
mod109
+7。細節太多,要慢慢講。
首先要知道條件,設有x行,y列有效取反,那麼s=x
n+ym
−2xy
s=xn+ym-2xy
s=xn+y
m−2x
y才會成立。
所以其實可以只列舉x
xx,就可以求出y=s
−xnm
−2
xy=\frac
y=m−2x
s−xn
。首先對於特殊情況分母為0時,對原式化簡得s=x
ns=xn
s=xn
∴ s=
m∗n/
2(∵m
−2x=
0∴x∗
2=m)
\therefore s=m*n/2(\because m-2x=0\therefore x*2=m)
∴s=m∗n
/2(∵
m−2x
=0∴x
∗2=m
)所以當分母為0且s=m
∗n/2
且x∗2
=m
s=m*n/2且x*2=m
s=m∗n/
2且x∗
2=m時y=0
否則當s−x
nm−2
x=⌊s
−xnm
−2x⌋
\frac=\lfloor \frac \rfloor
m−2xs−
xn=
⌊m−2
xs−x
n⌋時就可以計算出y
且y ≥0
,c−y
≥0,c
−ymo
d2=0
y\geq0,c-y\geq0,c-y \mod 2=0
y≥0,c−
y≥0,
c−ym
od2=
0,那怎麼算呢。
a ns
+=c(
n,x)
∗c(m
,y)∗
c((r
−x)/
2+n−
1,n−
1)∗c
((c−
y)/2
+m−1
,m−1
)ans+=c(n,x)*c(m,y)*c((r-x)/2+n-1,n-1)*c((c-y)/2+m-1,m-1)
ans+=c
(n,x
)∗c(
m,y)
∗c((
r−x)
/2+n
−1,n
−1)∗
c((c
−y)/
2+m−
1,m−
1)前面好理解,n行選擇x行的組合方案*m行選擇y行的組合方案,後面是處理重複的取反,為
( r−
x)/2
次,(c
−y)/
2次
(r-x)/2次,(c-y)/2次
(r−x)/
2次,(
c−y)
/2次無效取反,可以用隔板法,把無效取反放入隔板有多少種方案,給無效取反加上n-1(m-1)是為了留出空間。
#include
#define mod 1000000007
#define bll long long
using
namespace std;
bll n,m,r,c,f[
150001
],ans,s;
bll ksm
(bll x,bll y)
return ans;
}bll c
(bll n,bll m)
intmain()
elseif(
(s-x*m)
%(n-
(x<<1)
)==0)
}return
!printf
("%lld"
,ans)
;}
jzoj5862 孤獨 容斥
沒看懂題意 以為每個人只能聊天一次,語文水平被教育了 考慮容斥。我們只需要列舉n位二進位制s,計s為a i 子集的數量為cnt,那麼貢獻就是 1 x cntk 1 x c ntk,其中x為二進位制s中1的數量 於是乙個o 2n m o 2 n m 的暴力是70分 我們觀察可以發現每個a只會使它子集的...
jzoj5894 同餘方程 容斥
noip要是考成這shi樣可就涼了呀。首先可以想到令solve a,b 為x a,y b的答案,那麼答案就是solve r1,r2 solve l1,r2 solve l2,r1 solve l1,l2 現在看怎麼搞定solve。考慮列舉i j分別表示x的前i位等於a,y的前j位等於b,也就是說我們...
交流 題解(容斥原理 組合數)
在此。給你n nn個字串,其中選擇k kk個,如果合法則將 變成字元 26 2626 個都可以,前提是合法 構成乙個只含小寫字母的字串,求可以變成多少種字串。合法要求 乙個位置上要不只有一種小寫字母,要不是 解法 可以用狀壓dpdp dp或者容斥原理 組合數完成。首先鋪墊三個內容 交集 並集 集合大...