組合數 c_n^mcnm 表示的是從 nn 個物品中選出 mm 個物品的方案數。舉個例子,從 (1,2,3) 三個物品中選擇兩個物品可以有 (1,2),(1,3),(2,3)(1,2),(1,3),(2,3) 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 c_n^mcnm 的一般公式:
cnm=m!/(n−m)!n!
其中 n!=1×2×⋯×n;特別地,定義 0!=1。
小蔥想知道如果給定 n,m 和 k,對於所有的 0≤i≤n,0≤j≤min(i,m) 有多少對 (i,j)滿足 cij 是 k 的倍數。
輸入格式:
第一行有兩個整數 t,k,其中 t 代表該測試點總共有多少組測試資料,k 的意義見問題描述。
接下來 t 行每行兩個整數 n,m,其中 n,m 的意義見問題描述。
輸出格式:
共 t 行,每行乙個整數代表所有的 0≤i≤n,0≤j≤min(i,m) 中有多少對 (i,j) 滿足 cij 是 k 的倍數。
輸入樣例#1:複製
輸出樣例#1:複製1 2
3 3
1
輸入樣例#2:複製
輸出樣例#2:複製2 5
4 56 7
看到組合數問題,我們立馬想到有兩種實現組合數的方式,一種是計算單個組合數,另一種組合數打表。0
7
先從單個數的組合數開始介紹:首先,我們知道
第二種辦法就是利用如下公式(楊輝三角)打表。ll collocation(ll n ,ll m)
根據這樣的性質,我們可以用二維陣列c[n][m]來儲存每乙個數值。
好了,我們回到問題。ll c[500][500];
ll collocation(ll n, ll m)
}
我們要解出一定範圍內組合數是k的倍數的個數,那麼這意味著這些正好是k的倍數的組合數取餘k的值都是0,所以說我們最終計算一下有多少個0就行了。
但是這樣又有新的問題:取余是乙個高階運算,不可避免的,這要花費很多的時間,在一秒之內把2000*2000=4e6(極限資料)的組合數取餘,期間再對之前的資料進行多次查詢,再在主函式中遍歷讀出乙個4e6,這在極限資料例項裡顯然會超時。
所以我們引入了乙個新的查詢辦法來降低時間複雜度:二維字首和陣列。
什麼意思呢?就是模擬乙個矩形(二維陣列框進去的區域)不斷向外蠶食的情景。設有乙個矩形長為x,寬為y,我們來做個**看一下它儲存資料的過程。(橫軸為x,縱軸為y)
(0,0)
(1,0),
(2,0)
(3,0)
(4,0)
(0,1)
(1,1)
(2,1)
(3,1)
(4,1)
(0,2)
(1,2)
(2,2)
(3,2)
(4,2)
(0,3)
(1,3)
(2,3)
(3,3)
(4,3)
(0,4)
(1,4)
(2,4)
(3,4)
(4,4)
我們假設rec[0][0]=1
這樣就可以通過字首來訪問乙個區間的和了。
**:
#include #include #include #include #include #include #define determination main
#define lldin(a) scanf("%lld",&a)
#define din(a) scanf("%d",&a)
#define reset(a,b) memset(a,b,sizeof(a))
const int inf=0x3f3f3f3f;
using namespace std;
typedef long long ll;
typedef long double ld;
/*although there will be many obstructs ahead of you,
the desire for victory still fills you with determination..*/
ll c[2500][2500];
ll ans[2500][2500];
int t,k;
int n,m;
void init()
ans[i][i+1]=ans[i][i];
}}int determination()
return 0;
}
NOIP2016 組合數問題
題目描述 第一行有兩個整數t,k,其中t代表該測試點總共有多少組測試資料,k的意義見 問題描述 接下來t行每行兩個整數n,m,其中n,m的意義見 問題描述 t行,每行乙個整數代表答案。輸入樣例 1 1 23 3 輸入樣例 2 2 54 5 6 7 輸出樣例 1 1輸出樣例 2 07 樣例1說明 在所...
NOIP2016組合數問題
題目分析 dp不解釋。首先要來乙個組合數將cnm的值都預處理出來,不過在加起來的時候記得取模。接下來就是二維字首和的事情了。define m 2000 include include include include using namespace std int c m 3 m 3 sum m 3 ...
NOIP2016 組合數問題
題目描述 題目背景 noip2016 提高組 day2 t1 組合數 表示的是從 n 個物品中選出 m 個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 的一般公式 1 2 n。小蔥想知道如果給定...