rendered paste body#include <stdio.h>#include <memory.h>#define toggle(n,key) (key^=(1<<n))#define ison(n,key) (key&(1<<n))int n;long long memo[21][1048576];char adj[21][21];long long count_ways(int pos, unsigned long current){ int i; long long num_ways = 0; if(pos == n) return 1; if(memo[pos][current]!=0) { num_ways=memo[pos][current]; } else { for(i = 0 ; i < n ; i++) { if(adj[pos][i]==1) { if(!ison(i,current)) { toggle(i,current); num_ways += count_ways(pos+1, current); toggle(i,current); } } } memo[pos][current]=num_ways; } return num_ways;}int main(){ int _T; scanf("%d", &_T); while(_T--) { scanf("%d", &n); int is_adj, i, j; unsigned long current = 0; long long num_ways = 0; memset(adj, 0, sizeof(char)*441); for(i = 0 ; i < n ; i++) for(j = 0 ; j < n ; j++) { scanf("%d", &is_adj); if(is_adj) adj[i][j]=1; } /*Initialize memo table*/ memset(memo, 0, sizeof(memo)); for(i = 0 ; i < n ; i++) if(adj[0][i]==1) { toggle(i,current); num_ways += count_ways(1, current); toggle(i,current); } printf("%lld\n", num_ways); } return 0;}