组合数
var tra,ans:array[0..2000,0..2000]of longint;\tra[i,j]表示Cij(i为下标,j为上标)//dp
\ans[i,j]表示当n=i,m=j时的答案
n,m:array[1..10000]of longint;
i,j,t,k,mn:longint;
begin
readln(t,k);
for i:=1 to t do\\读入n,m
begin
readln(n[i],m[i]);
if m[i]>n[i] then m[i]:=n[i];\\若m>n,则ans[n,m]=ans[n,n],所以令m=n
if n[i]>mn then mn:=n[i];\\递推只需递推到最大的n即可
end;
for i:=0 to mn do\\初始化
tra[i,0]:=1;
tra[1,1]:=1;
for i:=2 to mn do\\i直接从第二层递推
begin
for j:=1 to i do
begin
tra[i,j]:=tra[i-1,j]+tra[i-1,j-1];\\应用组合公式计算组合数
if tra[i,j] mod k=0 then ans[i,j]:=1;\\若为k的倍数则答案加一
tra[i,j]:=tra[i,j] mod k;
ans[i,j]:=ans[i,j]+ans[i-1,j]+ans[i,j-1]-ans[i-1,j-1];\\答案的递推详情见下图
![](https://cdn.luogu.org/upload/pic/4157.png)
\就是上面加上下面在减去重复的部分
end;
for j:=i+1 to mn do
ans[i,j]:=ans[i,j]+ans[i-1,j]+ans[i,j-1]-ans[i-1,j-1];
end;
for i:=1 to t do
writeln(ans[n[i],m[i]]);
end.