計蒜客T3144 受力平衡(逆元 數學組合)

2021-10-08 16:09:51 字數 2257 閱讀 4839

題目

有 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 的正整數組成的數列,相鄰兩個整數之間用單個空...