P2822 組合數問題 NOIP2016

2021-08-30 17:58:08 字數 1367 閱讀 6344

組合數 cn

m​表示的是從 n 個物品中選出 m 個物品的方案數。舉個例子,從 (1,2,3) 三個物品中選擇兩個物品可以有 (1,2),(1,3),(2,3) 這三種選擇方法。根據組合數的定義,我們可以給出計算組合數 cn

m的一般公式:

c nm= n!(n−m)!/n!

​其中n!=1×2×⋯×n;特別地,定義 0!=1。

小蔥想知道如果給定 n,m 和 k,對於所有的0≤i≤n,0≤j≤min(i,m) 有多少對(i,j) 滿足ci

j是 k 的倍數。

輸入格式:

第一行有兩個整數 t,k,其中 t 代表該測試點總共有多少組測試資料,k 的意義見問題描述。

接下來 t 行每行兩個整數 n,m,其中n,m 的意義見問題描述。

輸出格式:

共 t 行,每行乙個整數代表所有的0≤i≤n,0≤j≤min(i,m) 中有多少對(i,j) 滿足ci

j是 k 的倍數。

輸入樣例#1:

1 23 3

輸出樣例#1:

輸入樣例#2:

2 54 5

6 7輸出樣例#2:07

【樣例1說明】

在所有可能的情況中,只有c2

1 =2是2的倍數。

由於對於每次輸入,雖然有很多個問題,但k是共用的,所以我們可以事先算出所有的組合數再對k取模,當模為0時即為k的倍數。

組合數可以根據公式遞推求得:

c(n,m)=c(n-1,m)+c(n-1,m-1)

因為求的是一共有多少個,所以很容易就能想到字首和。

這裡用的是二維字首和(因為i,j嘛)

二維字首和公式:

sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]

具體怎麼求的畫圖看看就知道了,人懶不想打了qaq

直接上**!

//組合數問題

#includeusing namespace std;

const int maxn=2001;

//c(n,m)=c(n-1,m)+c(n-1,m-1)

int c[maxn][maxn];//儲存組合數答案(取模後的)

int sum[maxn][maxn];//儲存有多少對(字首和)

int n,m,k,t;

void calc(){

c[1][0]=c[1][1]=1;

for(int i=2;i(嗯,沒屁放了)

P2822 組合數問題

題目描述 組合數c n mc n m 表示的是從n個物品中選出m個物品的方案數。舉個例子,從 1,2,3 三個物品中選擇兩個物品可以有 1,2 1,3 2,3 這三種選擇方法。根據組合數的定 義,我們可以給出計算組合數的一般公式 c n m m n m n 其中n 1 2 n 不清楚不要怪我,暫時找...

P2822 組合數問題

小蔥想知道如果給定 n,m 和 k,對於所有的 0 i n,0 j min i,m 有多少對 i,j i,j 滿足 ci取j 是 k 的倍數。輸入格式 第一行有兩個整數 t,kt,k,其中 tt 代表該測試點總共有多少組測試資料,k 的意義見問題描述。接下來 tt 行每行兩個整數 n,m,其中 n,...

P2822組合數問題

題目鏈結 眾所周知,小蔥同學擅長計算,尤其擅長計算組合數。而且這道題與組合數有關係。乍一看什麼思路沒有,硬想柿子想了半小時。不知道結論,wtcl。後來打表發現規律,發現是個非常水的規律題,然後5min寫完 3min調 交上去ac了。題外話 自己寫的快讀掛了。模 k 下的楊輝三角,值為 0 的位置權值...