#include<stdio.h>
#include<string.h>
int
le[30],n1[55],n2[55];
void
GF( )
{
memset
(n1,0,
sizeof
(n1));
memset
(n2,0,
sizeof
(n2));
n1[0]=1;
//在上一篇报告里面讲过其作用,可以说是一个入口
for
(
int
i=1;i<=26;++i)
{
for
(
int
j=0;j<=50;++j)
// j从0开始还是为了保留未参与合并的原值
for
(
int
k=0;k<=le[i]&&k*i+j<=50;k++)
// k从0开始是为了保留n1[x]中原有的值,不至于在
// 后面n1[x]=n2[x]语句中出现n1[x]数据丢失。
n2[j+k*i]+=n1[j];
// 这和前面的判断是否存在(只需赋值 为1)组合不同
for
(
int
j=0;j<=50;++j)
{
n1[j]=n2[j];
// k从0开始保证了n1[x]只增不减
n2[j]=0;
}
}
}
int
main()
{
int
T;
scanf
(
"%d"
,&T);
while
(T--)
{
int
cnt=0;
for
(
int
i=1;i<=26;++i)
scanf
(
"%d"
,&le[i]);
GF();
for
(
int
i=1;i<=50;++i)
// 题目是要统计小于50的所有可能
cnt+=n1[i];
printf
(
"%d\n"
,cnt);
}
return
0;
}