組合數 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 的位置權值...