#include<bits/stdc++.h>
using namespace std;
//macro for long long
typedef long long ll;
ll n;
ll a[21][21];
ll dp[2097152];
ll rec(ll b)
{
ll res=0,pos=0;
//finding the current position = no of 1's in binary representation of b
for(ll i=0;i<n;i++)
if(b&(1<<i))
pos++;
//memoization
if(dp[b]!=-1)
return dp[b];
//if all bits in b is 1
else if(pos==n)
{
dp[b]=1;
return dp[b];
}
else
{
res=0;
for(ll i=0;i<n;i++)
if( a[pos][i] && !( (1<<i) & b ) )
res+=rec(( (1<<i) | b ));
dp[b]=res;
return res;
}
}
int main()
{
ll t,j_limit=0;
cin>>t;
while(t--)
{
cin>>n;
//finding the maximum index till which dp array will be filled
j_limit=1;
for(ll i=0;i<=n;i++)
j_limit*=2;
//initializing dp array to -1
for(ll j=0;j<j_limit;j++)
dp[j]=-1;
//reading input
for(ll i=0;i<n;i++)
for(ll j=0;j<n;j++)
cin>>a[i][j];
//calling recursion
cout<<rec(0)<<"\n";
}
return 0;
}
ICAgICNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CgogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICAvL21hY3JvIGZvciBsb25nIGxvbmcKICAgIHR5cGVkZWYgbG9uZyBsb25nIGxsOwoKICAgIGxsIG47CgogICAgbGwgYVsyMV1bMjFdOwogICAgbGwgZHBbMjA5NzE1Ml07CgogICAgbGwgcmVjKGxsIGIpCiAgICB7CiAgICAgICAgbGwgcmVzPTAscG9zPTA7CgogICAgICAgIC8vZmluZGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiA9IG5vIG9mIDEncyBpbiBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYgogICAgICAgIGZvcihsbCBpPTA7aTxuO2krKykKICAgICAgICAgICAgaWYoYiYoMTw8aSkpCiAgICAgICAgICAgICAgICBwb3MrKzsKCiAgICAgICAgLy9tZW1vaXphdGlvbgogICAgICAgIGlmKGRwW2JdIT0tMSkKICAgICAgICAgICAgcmV0dXJuIGRwW2JdOwoKICAgICAgICAvL2lmIGFsbCBiaXRzIGluIGIgaXMgMQogICAgICAgIGVsc2UgaWYocG9zPT1uKQogICAgICAgIHsKICAgICAgICAgICAgZHBbYl09MTsKICAgICAgICAgICAgcmV0dXJuIGRwW2JdOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXM9MDsKICAgICAgICAgICAgZm9yKGxsIGk9MDtpPG47aSsrKQogICAgICAgICAgICAgICAgaWYoIGFbcG9zXVtpXSAmJiAhKCAoMTw8aSkgJiBiICkgKQogICAgICAgICAgICAgICAgICAgIHJlcys9cmVjKCggKDE8PGkpIHwgYiApKTsKICAgICAgICAgICAgZHBbYl09cmVzOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH0KICAgIH0KCgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIGxsIHQsal9saW1pdD0wOwogICAgICAgIGNpbj4+dDsKICAgICAgICB3aGlsZSh0LS0pCiAgICAgICAgewogICAgICAgICAgICBjaW4+Pm47CgogICAgICAgICAgICAvL2ZpbmRpbmcgdGhlIG1heGltdW0gaW5kZXggdGlsbCB3aGljaCBkcCBhcnJheSB3aWxsIGJlIGZpbGxlZAogICAgICAgICAgICBqX2xpbWl0PTE7CiAgICAgICAgICAgIGZvcihsbCBpPTA7aTw9bjtpKyspCiAgICAgICAgICAgICAgICBqX2xpbWl0Kj0yOwoKICAgICAgICAgICAgLy9pbml0aWFsaXppbmcgZHAgYXJyYXkgdG8gLTEKICAgICAgICAgICAgZm9yKGxsIGo9MDtqPGpfbGltaXQ7aisrKQogICAgICAgICAgICAgICAgZHBbal09LTE7CgogICAgICAgICAgICAvL3JlYWRpbmcgaW5wdXQKICAgICAgICAgICAgZm9yKGxsIGk9MDtpPG47aSsrKQogICAgICAgICAgICAgICAgZm9yKGxsIGo9MDtqPG47aisrKQogICAgICAgICAgICAgICAgICAgIGNpbj4+YVtpXVtqXTsKCiAgICAgICAgICAgIC8vY2FsbGluZyByZWN1cnNpb24KICAgICAgICAgICAgY291dDw8cmVjKDApPDwiXG4iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgIH0K