比赛 20121107 评测结果 AAAAA
题目名称 三只小猪 最终得分 100
用户昵称 Makazeu 运行时间 0.011 s
代码语言 C++ 内存使用 10.41 MiB
提交时间 2012-11-07 10:38:19
显示代码纯文本
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=105;
const int MAXL=200;
int bign=0,bigm=0,T;
int nn[MAXN],mm[MAXN];
class hugeint{public:int len,num[MAXL];
void clear(){memset(num,0,sizeof(num));len=0;}};
hugeint ichi,zero,ans;
hugeint F[MAXN][MAXN];
inline int Min(int a,int b){return a<b?a:b;}
inline int Max(int a,int b){return a>b?a:b;}
inline void init()
{
	scanf("%d\n",&T);
	for(int i=1;i<=T;i++)
	{
		scanf("%d %d\n",&nn[i],&mm[i]);
		if(nn[i]>bign) bign=nn[i];
		if(mm[i]>bigm) bigm=mm[i];
	}
}

inline hugeint times(hugeint a,hugeint b)
{
	hugeint res;res.clear();
	res.len=a.len+b.len-1;
	for(int i=1;i<=a.len;i++)
		for(int j=1;j<=b.len;j++)
			res.num[i+j-1]+=(a.num[i]*b.num[j]);
	for(int i=1;i<=res.len;i++)
	{
		res.num[i+1]+=res.num[i]/10;
		res.num[i]%=10;
	}	if(res.num[res.len+1]) res.len++; 
	return res;
}

inline hugeint plusadd(hugeint a,hugeint b)
{
	hugeint res;res.clear();
	res.len=Max(a.len,b.len);
	for(int i=1;i<=res.len;i++)
	{
		res.num[i]+=(a.num[i]+b.num[i]);
		res.num[i+1]+=res.num[i]/10;
		res.num[i]%=10;
	}if(res.num[res.len+1]) res.len++;
	return res;
}

inline hugeint trans(int k)
{
	hugeint res;res.clear();
	while(k)
	{
		res.num[++res.len]=k%10; k/=10;
	}return res;
}

inline void print(hugeint& res)
{
	if(res.len==0) {printf("0\n");return;}
	for(int i=res.len;i>=1;i--)
		printf("%d",res.num[i]);printf("\n");
}

inline void makestr()
{
	ichi.clear();ichi.len=1;ichi.num[1]=1;
	zero.clear();zero.len=1;zero.num[1]=0;
	F[0][0]=ichi;
	hugeint tres,ttime,tplus;
	for(int i=1;i<=bigm;i++) F[0][i]=zero;
	for(int i=1;i<=bign;i++) F[i][0]=zero;
	for(int i=1;i<=bign;i++)
		for(int j=1;j<=Min(i,bigm);j++)
		{
			tres=trans(j);
			ttime=times(tres,F[i-1][j]);
			tplus=plusadd(ttime,F[i-1][j-1]);
			F[i][j]=tplus;
		//	F[i][j]=plusadd(times(trans(j),F[i-1][j]),F[i-1][j-1]);
			//j*F[i-1][j]+F[i-1][j-1];
		}
}

int main()
{
	freopen("piggy.in","r",stdin);
	freopen("piggy.out","w",stdout);
	init(); makestr();
	for(int i=1;i<=T;i++)
		print(F[nn[i]][mm[i]]);
	return 0;
}