題目:
有 n 個不同的氣球和 m 個不同的重物,每個氣球都可以提供 1n 的公升力(豎直向上),每個重物都會受到 1n 的重力(豎直向下)。
現要選出若干個氣球和若干個重物,將他們固定在一起,並且使得固定之後的整體受力平衡,請問共有多少種滿足條件的方案?
輸入資料第一行乙個正整數 t,表示測試資料組數
接下來 t 行,每行包含兩個空格隔開的正整數 n 和 m
輸出 t 行,每行包括乙個數字,表示答案除以 (10^9+7 ) 的餘數
對於 20% 的資料,m = 1
對於 60% 的資料,1≤ n,m ≤10^3,1≤ t ≤10^4
對於全部的資料,1≤ n,m ≤10^6,1 ≤ t ≤10^6
輸出時每行末尾的多餘空格,不影響答案正確性
樣例輸入
1
2 3
樣例輸出
9
樣例解釋
不妨用 b1,b2 表示兩個氣球,用 w1,w2,w3 表示三個重物
下面每行都描述了乙個符合要求的方案
b1,w1
b1,w2
b1,w3
b2,w1
b2,w2
b2,w3
b1,b2,w1,w2
b1,b2,w1,w3
b1,b2,w2,w3
題解:
1.先看題目用例,氣球2個,重物3個,氣球我可以用1個,也可以用2個;如果用1個,有2種選擇,此時重物有3種選擇,共2*3種;如果用2個,氣球只有1種選擇,而重物有3種選擇,共1*3種;共2*3+1*3=9,如果用組合數表示:2.由此推廣到氣球n個,重物m個,可得答案為:(假設你n<=m)
3.接下來對其進行化簡:(如果通過複雜的數學公式推導,本人水平有限,不會)先將原式改寫一下:(用到組合數基本性質:得到
我們在原本的基礎上增加了第一項,保持值不變,我們在最後一項減去,並且我們可以發現這一項的值為1。
即為:
為了求出其值,我們建立乙個模型:
假設你現在單身,有來自北方的和南方兩種風格的女朋友任君挑選,北方的n個人記為a隊,南方的m個人記為b隊,由於南方的人口比北方多,可知m>=n;現在讓你做出乙個艱難的決定,讓你從中挑選n個人作為你的女朋友,有多少種選法?(如果你是女生,自動腦補為男朋友)
<1>.有最簡單的排列組合知識知有:選法
<2>.從另一種角度來看,你對南方或者北方的風格有側重,可以從南方選k個,剩下(n-k)個從北方選(k從0到n):
這樣得到的結果為:
由<1>,<2>知兩個結果是相等的,可推出=
接著推出=也就是(m+n)!/(m!*n!)-1;
(注:這其實來自於乙個非常經典的證明:
4.最重要的解決了,現在是**實現,由上一步結果知我們需要計算(m+n)的階乘,有多組測試用例,節省時間,我們需要打表實現階乘,然後又逆元部分(利用快速冪+費馬小定理 可參考部落格:)可得出(m+n)!/(m!*n!)%mod=(m+n)!*pow(m!,mod-2)*pow(n!,,mod-2)%mod,由於數比較大,所以需要每一步mod上mod,則結果為%mod,然後用快速冪替換冪運算;
ac**
#include#define ll long long
const int mod = 1e9+7;
ll md[2000005]; //n+m
ll quick_pow(ll x,ll n,ll m)
return res;
}int main()
//打表
int t;
scanf("%d",&t);
while(t--)
return 0;
}
計蒜客t36352 魔法
肯定我要佔滿所有的葉子結點,否則以乙個葉子節點建樹的時候你選的所有點就都在一棵子樹裡,也就不符合要求。反過來,選擇了所有葉子節點,可以證明它是可行的,所以葉子節點構成的集合滿足要求而且最小。如果k 0 k 0k 0直接求出度為1 11的點的數目就好了 如果k 1 k 1k 1,列舉刪哪條邊,我用 x...
紅與黑 計蒜客 T1211
題目鏈結 典型的深搜題,基礎題。蒜廠有一間長方形的房子,地上鋪了紅色 黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫乙個程式,計算你總共能夠到達多少塊黑色的瓷磚。輸入格式第一行是兩個整數 w和 h,分別表示 x 方向和 y 方向瓷磚的數量。w 和 h 都不超過 ...
計蒜客T1195 和數
蒜頭君給定乙個正整數序列,判斷其中有多少個數,等於數列中其他兩個數的和。比如,對於數列1 2 3 4,這個問題的答案就是 2,因為 3 2 1,4 1 3。輸入格式 共兩行,第一行是數列中數的個數 n 1 n 100 第二行是由 n 個不大於 10000 的正整數組成的數列,相鄰兩個整數之間用單個空...