比赛 2017noip 评测结果 ATATATATATATATATATAT
题目名称 组合数问题 最终得分 50
用户昵称 补魔 运行时间 10.173 s
代码语言 C++ 内存使用 31.14 MiB
提交时间 2017-09-21 08:05:29
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2010;
int c[maxn][maxn],f[maxn][maxn];
int t,k,n,m,cnt;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int main()
{
	freopen("problem.in","r",stdin);freopen("problem.out","w",stdout);
	t=read();k=read();	
	while(t)
	{
		t--;
		n=read();m=read();
		cnt=0;	
		memset(c,0,sizeof(c));
		memset(f,0,sizeof(f));
		for(int i=0;i<=n;i++)
		{
			c[i][0]=1;
		}
		for(int i=0;i<=n;i++)
		for(int j=0;j<=min(i,m);j++)
		{
			if(c[i][j]==0)
				c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
			if(c[i][j]==0)
				f[i][j]=f[i][j-1]+1;
			else
				f[i][j]=f[i][j-1];
		}
		for(int i=0;i<=n;i++)
		{
			cnt+=f[i][min(i,m)];
		}
		printf("%d\n",cnt);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}