记录编号 126282 评测结果 AAAAA
题目名称 三只小猪 最终得分 100
用户昵称 Gravatarchs 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-10-11 21:33:37 内存使用 0.53 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
const int maxn=21;
const int base=10000;
class bign
{
	public:
		int len;
		int num[maxn];
};
void binit(bign &a,int x)
{
	a.len=0;
	while(x>0)
	{
		int temp=x%base;
		a.num[a.len++]=temp;
		x/=base;
	}
}
void bprint(bign a)
{
	if(a.len==0)
	{
		cout<<0<<endl;
		return ;
	}
	cout<<a.num[a.len-1];
	for(int i=a.len-2;i>=0;i--) printf("%04d",a.num[i]);
	cout<<endl;
}
bign bplus(bign a,bign b)
{
	a.len=max(a.len,b.len);
	for(int i=0;i<a.len;i++)
	{
		a.num[i]+=b.num[i];
	}
	for(int i=0;i<a.len-1;i++)
	{
		if(a.num[i]>=base)
		{
			a.num[i+1]+=a.num[i]/base;
			a.num[i]%=base;
		}
	}
	if(a.num[a.len-1]>=base)
	{
		a.num[a.len]+=a.num[a.len-1]/base;
		a.num[a.len-1]%=base;
		a.len++;
	}
	return a;
}
bign bmul(bign a,bign b)
{
	bign c={0};
	c.len=a.len+b.len-1;
	for(int i=0;i<a.len;i++)
		for(int j=0;j<b.len;j++)
			c.num[i+j]=a.num[i]*b.num[j];
	for(int i=0;i<c.len-1;i++)
	{
		if(c.num[i]>=base)
		{
			c.num[i+1]+=c.num[i]/base;
			c.num[i]%=base;
		}
	}
	if(c.num[c.len-1]>=base)
	{
		c.num[c.len]+=c.num[c.len-1]/base;
		c.num[c.len-1]%=base;
		c.len++;
	}
	return c;
}
//=========== 主程序 ===========//
const int M=50;
bign F[M+1][M+1];
void init()
{
	int i,j;
	for(i=0;i<=M;i++)
	{
		for(j=0;j<=M;j++)
		{
			if(i>=1&&i==j) binit(F[i][j],1);
			else binit(F[i][j],0);
		}
	}
	int p,k;
	for(p=1;p<=M;p++)
	{
		for(k=1;k<p;k++)
		{
			bign temp;
			binit(temp,k);
			F[p][k]=bplus(bmul(temp,F[p-1][k]),F[p-1][k-1]);
		}
	}
}
void print()
{
	int T;
	int n,m;
	cin>>T;
	for(int i=1;i<=T;i++)
	{
		cin>>n>>m;
		bprint(F[n][m]);
	}
}
int main()
{
	freopen("piggy.in","r",stdin);
	freopen("piggy.out","w",stdout);
	init();
	print();
	return 0;
}