NOIP2016 提高組Day2 T1 組合數問題

2021-07-25 09:26:39 字數 1350 閱讀 1632

題目描述

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

其中n! = 1×2×···×n 

小蔥想知道如果給定n,m和k,對於所有的0<=i<= n,0<=j<= min(i,m)有多少對 (i,j)滿足是k的倍數。 

輸入格式

第一行有兩個整數t,k,其中t代表該

測試點總共有多少組測試資料,k的意義見問題描述。 

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

輸出格式 

t行,每行乙個整數代表答案。 

樣例輸入1

1 2 

3 3 

樣例輸出1

1 樣例輸入2

2 5 

4 5 

6 7 

樣例輸出2

0 7 

資料範圍

這道題其實是楊輝三角問題,因為最後的答案只要對k取餘,所以可以先算出每個c[n,m]對k取餘的值,用flag[n,m]儲存它能否整除k,最後的答案統計f[1..n,1..m]即可。

const

maxn=5000;

varf,flag:array[0..maxn,0..maxn]of longint;

i,j,t,k,n,m:longint;

begin

readln(t,k);

for i:=1 to maxn do 

begin 

a[i,1]:=i mod k;

a[i,i]:=1; 

end;

for i:=3 to maxn do

for j:=2 to i-1 do

a[i,j]:=(a[i-1,j]+a[i-1,j-1]) mod k;

for i:=1 to maxn do

for j:=1 to i do

if a[i,j]=0 then

flag[i,j]:=1;

fillchar(a,sizeof(a),0);

for i:=1 to maxn do

for j:=1 to maxn do

a[i,j]:=a[i-1,j]+a[i,j-1]-a[i-1,j-1]+flag[i,j];

for i:=1 to t do

begin

read(n,m);

writeln(a[n,m]);

end;

end.

NOIP2016提高組day2 蚯蚓

本題中,我們將用符號 lcj 表示對 c 向下取整,例如 l3.0j l3.1j l3.9j 3 蛐蛐國最近蚯蚓成災了!隔壁跳蚤國的跳蚤也拿蚯蚓們沒辦法,蛐蛐國王只好去 請神刀手來幫他們消滅蚯蚓。蛐蛐國裡現在共有 n 只蚯蚓 n 為正整數 每只蚯蚓擁有長度,我們設第 i 只匠 蚓的長度為 ai i ...

NOIP 2016 提高組 Day2 組合數問題

是我想起了有一年考過相似的題目 當時用的是楊輝三角。思路 遞推 矩陣字首和 關於矩陣字首和 c n,m c n 1,m c n 1,m 1 就可以直接遞推出2000以內的所有的組合數。而我們只需要判斷有多少個點對滿足是k的倍數,很容易想到只要對k取模,對於為0的c i,j 是肯定滿足是k的倍數的。因...

NOIP2016提高組 day2 組合數問題

總所周知 階乘int到14就爆了long long到20也就爆了,所以說直接存肯定是不行的 在觀察一下題目發現試求組合數是k的倍數,所以說可以把k作為mod,餘數為零肯定就是k的倍數啦,否則不是。又因為由二項式定理 易得二項式展開的每一項就包涵組合數的答案。我們又已知楊輝三角其實就是二項式的係數恰好...