比赛 2017noip 评测结果 ATATATATATATATATATAT
题目名称 组合数问题 最终得分 50
用户昵称 玉带林中挂 运行时间 10.153 s
代码语言 C++ 内存使用 31.14 MiB
提交时间 2017-09-21 11:22:55
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2000+10;
int c[maxn][maxn],f[maxn][maxn];
int t,k,n,m,cnt;

int main()
{
	freopen("problem.in","r",stdin);
	freopen("problem.out","w",stdout);
	
	scanf("%d%d",&t,&k);
	
	while(t)
	{
		t--;
		scanf("%d%d",&n,&m);
		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);
	}
	return 0;
}