mat[id[i]][id[i]]=-n;
for(j=0;j
if(flag[k]==1)continue;
mat[id[i]][id[k]]+=1;
}
}
/*printf("%d\n",tot);
printf("Matrix has %d rows and %d columns\n",tot,tot+1);
for(i=0;i
puts("");
}
puts("*******");*/
}
ll gcd(ll a,ll b){
if (b==0)
return a;
else return gcd(b,a%b);
}
bool gauss(){
int i,j,row,id;
ll maxx;
for(row=0;row
for(i=row+1;i
id=i;
}
//if(maxx==0)continue;
if(id!=row){
for(j=0;j<=tot;j++)
swap(mat[row][j],mat[id][j]);
}
for(i=row+1;i
ll q=gcd(mat[i][row],mat[row][row]);
ll gb=mat[i][row]*mat[row][row]/q;
l1=gb/mat[i][row];
l2=gb/mat[row][row];
for(j=row;j<=tot;j++)
mat[i][j]=mat[i][j]*l1-mat[row][j]*l2;
}
}
/*for(i=0;i
puts("");
}
puts("*******");*/
}
for(i=tot-1;i>=0;i--){
for(j=i+1;j
mat[i][i]=mat[i][tot]/mat[i][i];
}
return 1;
}
int main(){
int t,T,m,i;
//freopen("a.txt","r",stdin);
//freopen("b.txt","w",stdout);
scanf("%d",&T);
for(t=1;t<=T;t++){
scanf("%d",&n);
pos=0,newnode();
scanf("%s",s);
insert();
makefail();
make_mat();
gauss();
printf("Case %d:\n",t);
printf("%lld\n",mat[0][0]);
if(t!=T) puts("");
}
}