比赛 |
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;
}