启发1:快速求解组合数的方法——杨辉三角打表。注意long long,杨辉三角本质是公式
启发2:对结果取余的题,如果中间结果大,可以考虑在过程中取余,这是一种偏方法,常用于求解倍数问题。
启发三:使用前缀和数组降维
#include<bits/stdc++.h>
using namespace std;
// 1
// 1 1
// 1 2 1
// 1 3 3 1
// 1 4 6 4 1
//1 5 10 10 5 1
//1
//1 2 1
//1 3 3 1
//1 4 6 4 1
//1 5 10 10 5 1
const int N=2e3+10;
long long C[N][N]={0};
int main(void)
{
int t,k;
cin>>t>>k;
C[1][1]=1;
for(int i=2;i<=2000;i++)
for(int j=1;j<=i;j++)
C[i][j]=(C[i-1][j]%k+C[i-1][j-1]%k)%k;
while(t--){
int cnt=0;
int n,m;cin>>n>>m;
n++;m++;
for(int i=1;i<=n;i++){
for(int j=1;j<=min(i,m);j++){
if(C[i][j]%k==0){
cnt++;
}
}
}
cout<<cnt<<endl;
}
}