/* A086264 Number of real {0,1} n X n matrices having determinant=1 Output for n=2~7: 2 3 3 84 4 10020 5 4851360 6 9240051240 7 67745781734400 */ #include #include #include #include #include #include #include #include using namespace std; #define min(a,b) (((a)<(b))?(a):(b)) #define max(a,b) (((a)>(b))?(a):(b)) #define min_(a,b) {if(a>(b))a=(b);} #define max_(a,b) {if(a<(b))a=(b);} #if defined _MSC_VER || defined __MINGW32__ #define I64 "I64" #else #define __int64 long long #define I64 "ll" #endif unsigned __int64 mp; unsigned row[33]; unsigned ub; unsigned n; unsigned __int64 factorial(unsigned n){ unsigned i; unsigned __int64 ans=1; for(i=2;i<=n;i++){ ans*=i; } return ans; } int n2; int n1; int str[33]; int invcnt=1; int detval; void per_dfs(int k){ int i; if(k!=n){ if(row[k]>>str[k]&1){ per_dfs(k+1); } for(i=k+1;i>str[i]&1){ swap(str[i],str[k]); invcnt=-invcnt; per_dfs(k+1); invcnt=-invcnt; swap(str[i],str[k]); } } } else{ detval+=invcnt; } } void det(){ detval=0; per_dfs(0); int tmp; tmp=abs(detval); if(tmp==1){ mp++; } } void dfs(int idx){ if(idx==0){ int st=row[n1]>>n2<0;row[idx]--) { det(); } return; } for(row[idx]=row[idx+1]-1;row[idx]>0;row[idx]--) { dfs(idx-1); } } int main(int argc,char ** argv){ for(n=2;n<=7;n++) { mp=0; ub=1<>n1;row[n1]--){ dfs(n1-1); } printf("%d %"I64"u\n",n,mp*factorial(n)/2); } return 0; }