题目:https://www.luogu.org/problemnew/solution/P2822
组合数可以用杨辉三角预处理!!!
https://blog.csdn.net/xiaobai__lee/article/details/77368430
t组询问可以像二维前缀和一样预处理
num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1]
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int c[2000+5][2000+5],num[2000+5][2000+5];//num数组类似前缀和
int t,k;
void prepare()
{
int i,j;
memset(c,0,sizeof(c));
memset(num,0,sizeof(num));
c[1][0]=1; c[1][1]=1;
for (i=2;i<=2000;i++)
{
for (j=0;j<=i;j++)
{
if (j==0)
c[i][0]=1;
else
c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
}
}
for (i=1;i<=2000;i++)
{
for (j=0;j<=2000;j++)
{
if (j==0)
num[i][0]=0;
else
num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1];
if (c[i][j]==0 && i>=j)
num[i][j]++;
// printf("%d ",num[i][j]);
}
// printf("\n");
}
}
int main()
{
int i,x,y;
freopen("a.txt","r",stdin);
scanf("%d%d",&t,&k);
prepare();
for (i=0;i<t;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",num[x][y]);
}
return 0;
}