问题描述
输入
输出
样例输入
Sample Input1:
1 2
3 3
Sample Input2:
2 5
4 5
6 7
样例输出
Sample Output1:
1
Sample Output2:
0
7
算法讨论
利用杨辉三角形求出组合数,记录一下前缀和就好了。
#include <cstdio>
using namespace std;
#define maxn 2006
int a[maxn][maxn],sum[maxn][maxn],d[10000][3],ans;
int n,m,t,k,mxn,mxm;
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
scanf("%d%d",&t,&k);
for (int i=1;i<=t;i++)
{
scanf("%d%d",&d[i][1],&d[i][2]);
mxn=max(mxn,d[i][1]);
mxm=max(mxm,d[i][2]);
}
for (int i=0;i<=mxn;i++)
a[i][0]=1;
for (int i=1;i<=mxn;i++)
for (int j=1;j<=i;j++)
{
a[i][j]=(a[i-1][j]+a[i-1][j-1]) % k;
if (a[i][j]==0)
sum[i][j]=sum[i-1][j]+1;
else
sum[i][j]=sum[i-1][j];
}
for (int i=1;i<=t;i++)
{
ans=0;
for (int j=1;j<=d[i][2];j++)
ans+=sum[d[i][1]][j];
printf("%d\n",ans);
}
fclose(stdin); fclose(stdout);
return 0;
}