題目描述
小奇的花園裡有n行m列棵桃花樹,花色各不相同。小奇漫步在花園中,有時它覺得某一行/列的桃花很美,便會在這一整行/列的每棵樹下撿一枚花瓣,到了傍晚,他發現自己選擇了r行c列(同一行/列可能被選擇不止一次)的花瓣。
回家之後,小奇發現:有s種顏色的花瓣數為奇數,他想知道,有多少種選擇方案能有這樣的效果呢?(兩種方案不同當且僅當某行/列被選擇的次數不同)
輸入格式
第一行包括5個整數,n,m,r,c,s。
輸出格式
輸出乙個整數表示答案(mod 1000000007)。
樣例樣例輸入
2 2 2 2 4
樣例輸出
4
資料範圍與提示
對於 20% 的資料, n,m ≤ 4,r,c ≤ 4;
對於 50% 的資料, n,m ≤ 500,r,c ≤ 2000;
對於另外10% 的資料, n,m ≤ 100000,s = n * m;
對於 100% 的資料, n,m ≤ 100000,r,c ≤ 100000,s ≤ 10^12。
思路:這就是一道裸的數學排列組合題,設有x行被選擇奇數次,有y列被選擇奇數次,因為奇+偶=奇,奇+奇=偶,偶+偶=偶,而題中s為奇數,則可列出這樣的等式:x*(m-y)+y*(n-x)=s,解得:y=(s-x*m)/(n-2*x),列舉x即可得出y,用每對x,y計算種類再加和,即為答案(分步加法)。那怎樣計算每對x,y對應的種類數呢,當然用組合數求解。
對於每對x,y,而題目中限制只有r次,問題可轉化成把r個蘋果分到n個盤子中,保證有x個奇數盤子,先把x個蘋果分別放到x個盤子中,方案數為cxn,之後剩下(r-x)個蘋果,把這些蘋果分成(r-x)/2對放到n個盤子中允許為空,用隔板法解決。防止(r-x)/2對蘋果填不滿n個盤子,加上n個盤子,則有(r-x)/2對蘋果和n個空分成n份放入n個不同的盤子(可以理解成有序)一共有(r-x)/2+n-1個空,插入n-1個隔板,方案數為cn-1
(r-x)/2+n-1 ,同理y也如此,則對每對x,y方案數為cxn*cn-1(r-x)/2+n-1*cy
m*cm-1
(c-y)/2+m-1
方案數用逆元求即可。
1 #include2 #include3view codeusing
namespace
std;
4 typedef long
long
ll;5
const
int mod=1000000007,maxn=200000+10;6
ll r,c,n,m;
7ll f[maxn],fac[maxn],ine[maxn];
8ll s;
9void
init()
18 f[0]=1;19
for(int i=1;i<=200000;i++) f[i]=f[i-1]*ine[i]%mod;//
逆元的階乘20}
21ll cmb(ll x,ll y)//
組合數28 ll cal(int x,int
y)//
每對x,y對應的方案數
37int
main()//
注意列舉x時當(n==2*i&&s==i*m)此時j可取範圍以內的任何值 46}
47else52}
53}54 printf("
%lld\n
",ans);
55return0;
56 }
排列 組合數學
定義 從n個不同的元素中,取出m個不同元素,按照順序排成一列,叫做從n個元素取出m個元素的乙個排列。我們將從n個不同的元素取出m個元素所得到得不同排列數,叫做從n個元素取出m個元素的排列數 記為a n,m 其中n m a n,m n n 1 n m 1 n n m 定義 n個不同元素中取m個不同元素...
數學基礎 排列組合
a開頭的叫排列,c開頭的叫組合。排列a n,m n n 1 n m 1 n n m n為下標,m為上標,以下同 組合c n,m p n,m p m,m n m n m 排列 permutation 數學的重要概念之一。有限集的子集按某種條件的序化法排成列 排成一圈 不許重複或許重複等。從n個不同元素...
數學上的排列組合
下午一同事提出乙個有趣的問題 一行字母 數字符號也行 中間插入特定字元 字元型別不定,我這裡用加號 字母的順序不能變,如下 ab a b 1種 abc a bc ab c a b c 3種 abcd a bcd ab cd a b cd abc d a bc d ab c d a b c d 7種 ...