NOIP 2016 組合數問題

2021-09-12 08:42:08 字數 2504 閱讀 5426

組合數 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 2

3 3

輸出樣例#1:複製

1
輸入樣例#2:複製

2 5

4 56 7

輸出樣例#2:複製

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。小蔥想知道如果給定...