比赛 20121107 评测结果 AAAAA
题目名称 三只小猪 最终得分 100
用户昵称 feng 运行时间 0.669 s
代码语言 C++ 内存使用 44.02 MiB
提交时间 2012-11-07 10:14:15
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 105
#define dbase 10000
using namespace std;
struct node{
	int a[1000];
}f[105][105];
int n,m,i,j;
int T;
node a;
int min(int a,int b)
{
	return a<b?a:b;
}
void multi(int x,int y,int k){
	for (int i=0;i<=f[x][y].a[0];i++)
		a.a[i]=f[x][y].a[i];
	for (int i=1;i<=a.a[0];i++)
		a.a[i]*=k;
	for (int i=1;i<=a.a[0];i++)
	{
		a.a[i+1]+=a.a[i]/10;
		a.a[i]=a.a[i]%10;
	}
	a.a[0]++;
	while (a.a[a.a[0]]>=10)
	{
		a.a[a.a[0]+1]+=a.a[a.a[0]]/10;
		a.a[a.a[0]]=a.a[a.a[0]]%10;
		a.a[0]++;
	}
	a.a[0]+=10;
	while (a.a[a.a[0]]==0 && a.a[0]>0)
		a.a[0]--;
}
void plus(node x,int xx,int yy)
{
	int l=x.a[0]>f[xx][yy].a[0]?x.a[0]:f[xx][yy].a[0];
	for (int i=1;i<=l;i++)
		f[xx][yy].a[i]+=x.a[i];
	for (int i=1;i<=l;i++)
	{
		f[xx][j].a[i+1]+=f[xx][j].a[i]/10;
		f[xx][j].a[i]%=10;
	}
	
	while (f[xx][yy].a[l]>=10)
	{
		f[xx][yy].a[l+1]+=f[xx][yy].a[l]/10;
		f[xx][yy].a[l+1]%=10;
		l++;
	}
	l+=10;
	while (f[xx][yy].a[l]==0 && l>0)
		l--;
	f[xx][yy].a[0]=l;
}
int main()
{
	freopen("piggy.in","r",stdin);
	freopen("piggy.out","w",stdout);
	scanf("%d",&T);
	for (int II=1;II<=T;II++)
	{
		memset(f,0,sizeof(f));
		scanf("%d%d",&n,&m);
		f[0][0].a[1]=1;
		f[0][0].a[0]=1;
		for (i=1;i<=n;i++)
			for (j=1;j<=min(i,m);j++)
			{
				memset(a.a,0,sizeof(a.a));
				multi(i-1,j,j);
				plus(a,i,j);
				a=f[i-1][j-1];
				plus(a,i,j);
			}
		for (i=f[n][m].a[0];i>0;i--)
			printf("%d",f[n][m].a[i]);
		if (f[n][m].a[0]==0) printf("0");
		printf("\n");
	}
	return 0;
}