zz
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define pp 100000007 #define N 35 vector<int> pri; #define num(i,j) ((((i)-1)*n)+(j)) int n,m,c[N][N],Map[5000][N][N],sz; int mat[5065][N*N]; long long ans; void prepare() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&c[i][j]); int x=c[i][j]; for(int k=2;k*k<=n;k++) if(x%k==0) { pri.push_back(k); while(x%k==0) x/=k; } if(x>1) pri.push_back(x); } sort(pri.begin(),pri.end()); pri.erase(unique(pri.begin(),pri.end()),pri.end()); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int x=c[i][j]; sz=pri.size()-1; for(int k=0;k<=sz;k++) while(x%pri[k]==0) Map[k][i][j]^=1,x/=pri[k]; } } void makematrix() { for(int i=1;i<=n;i++) { mat[i][0]=1; for(int j=1;j<=n;j++) mat[i][num(i,j)]=1; } for(int i=1;i<=n;i++) { mat[n+i][0]=1; for(int j=1;j<=n;j++) mat[n+i][num(j,i)]=1; } m=n+n; for(int k=0;k<=sz;k++) { mat[++m][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mat[m][num(i,j)]=Map[k][i][j]; } } void gauss() { int num=0; ans=1; int pos=1; for(int i=1;i<=n*n;i++) { bool q=0; for(int j=pos;j<=m;j++) { if(mat[i][j]) { swap(mat[pos],mat[j]),q=1; break; } if(!q)num++; else pos++; for(int j=pos;j<=m;j++) { if(mat[j][i]) for(int k=0;k<=n*n;k++) mat[j][k]^=mat[pos-1][k]; } } } for(int i=1;i<=m;i++) { bool q=0; for(int j=1;j<=n*n;j++) if(mat[i][j]) {q=1;break;} if(q) continue; if(mat[i][0]) ans=0; } for(int i=1;i<=num;i++) ans=ans*2%pp; } } int main() { prepare(); makematrix(); gauss(); printf("%lld\n",ans); }
zz