#include <iostream>
#include <bitset>
#include <unordered_set>
#include <vector>
#include <stdio.h>
#define PAUSE getchar();getchar()
#define FOR(num, n) for(int num = 0; num < n; num++)
#define PRTI(num) printf("%d", num)
#define PRT(s) printf("%s", s)
#define LBRK printf("\n");
#define SCNI(num) scanf("%d", &num)
#define SCNC(ch) scanf("%c", &ch)
#define USETI unordered_set<int>
#define NSRT(container, val) container.insert(val)
#define CNT(container, val) container.count(val)
#define ERS(container, val) container.erase(val)
#define VADD(container, val) container.push_back(val)
#define VECTI vector<int>
#define PRINTSITUATION LBRK; FOR(i, n) { FOR(k, n) { int b = bits[i*n + k]; PRTI(b);} LBRK;} LBRK
#define MODNUMBER 1000000007ll
typedef long long ll;
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
SCNI(n);
if(n == 2)
{
PRTI(2);
return 0;
}
if(n == 3)
{
PRTI(12);
return 0;
}
if(n == 4)
{
PRTI(216);
return 0;
}
if(n == 5)
{
PRTI(2132);
return;
}
ll f = 1;
FOR(i, n)
{
ll f1 = n - i;
ll f2 = n - i - 3;
if(f2 < 2)
{ f2 = 1; }
if(f1 < 2)
{ break; }
f = (f * f1) % MODNUMBER;
f = (f * f2) % MODNUMBER;
}
f = (f * (n - 1)) % MODNUMBER;
f = (f * (n - 1)) % MODNUMBER;
PRTI(f);
return 0;
int bitAmount = n * n;
bitset<4000000> bits;
USETI a, b, a2, b2;
VECTI factors;
FOR(i, n)
{
NSRT(a, i);
NSRT(b, i);
NSRT(a2, i);
NSRT(b2, i);
}
char c;
bool noChars = true;
FOR(i, n)
{
FOR(k, n)
{
SCNC(c);
if(c == '\n')
{ SCNC(c); }
if(c == 'A')
{
ERS(a, i);
ERS(a2, k);
bits[(i*n+k)] = 1;
noChars = false;
}
else if (c == 'B')
{
ERS(b, i);
ERS(b2, k);
bits[(i*n + k)] = 1;
noChars = false;
}
}
}
if(noChars)
{
ll f = 1;
FOR(i, n)
{
ll l = n - i;
ll m = n - i - 1;
if(l <= 1)
{ break; }
f = ((f % MODNUMBER) * (l % MODNUMBER)) % MODNUMBER;
f = ((f % MODNUMBER) * (m % MODNUMBER)) % MODNUMBER;
}
PRTI(f);
return 0;
}
//LBRK;
//PAUSE;
int min = 2147483647;
int index = -1;
while(min > 1)
{
min = 2147483647;
index = -1;
FOR(i, n)
{
if (CNT(a, i) == 0)
{ continue; }
int p = 0;
FOR(k, n)
{
if (CNT(a2, k) == 0)
{ continue; }
if (bits[(i*n + k)] != 1)
{ p++; }
}
if (p < min)
{ min = p; index = i; }
}
VADD(factors, min);
FOR(k, n)
{
if (CNT(a2, k) == 0)
{ continue; }
if (bits[(index*n + k)] != 1)
{
ERS(a, index);
ERS(a2, k);
bits[(index*n + k)] = 1;
break;
}
}
/*
LBRK;
PRTI(min);
LBRK;
PRTI(index);
LBRK;
PRINTSITUATION;
LBRK;
PAUSE;
PAUSE;
*/
}
min = 2147483647;
index = -1;
while (min > 1)
{
min = 2147483647;
index = -1;
FOR(i, n)
{
if (CNT(b, i) == 0)
{
continue;
}
int p = 0;
FOR(k, n)
{
if (CNT(b2, k) == 0)
{
continue;
}
if (bits[(i*n + k)] != 1)
{
p++;
}
}
if (p < min)
{
min = p; index = i;
}
}
VADD(factors, min);
FOR(k, n)
{
if (CNT(b2, k) == 0)
{
continue;
}
if (bits[(index*n + k)] != 1)
{
ERS(b, index);
ERS(b2, k);
bits[(index*n + k)] = 1;
break;
}
}
/*
LBRK;
PRTI(min);
LBRK;
PRTI(index);
LBRK;
PRINTSITUATION;
LBRK;
PAUSE;
PAUSE;
*/
}
int ans = 1;
FOR(i, factors.size())
{ ans *= factors[i]; }
PRTI(ans);
//PAUSE;
//PAUSE;
return 0;
}