//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
const int N=505;
char s[N][N];int fa[N],sz[N],bin[N],n,m,res;
inline int find(R int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void ck(){
if(n&1){
R int c=(n+1)>>1,fl=1;
fp(j,1,m)if(s[c][j]!=s[c][m-j+1]){fl=0;break;}
if(!fl)res*=2;
}
if(m&1){
R int r=(m+1)>>1,fl=1;
fp(i,1,n)if(s[i][r]!=s[n-i+1][r]){fl=0;break;}
if(!fl)res*=2;
}
}
int fac[15],st[15],top;
bool ck(R int i,R int j){
top=0;
st[++top]=s[i][j];
st[++top]=s[n-i+1][j];
st[++top]=s[i][m-j+1];
st[++top]=s[n-i+1][m-j+1];
sort(st+1,st+1+top);
R int sum=1;
for(R int l=1,r=1;l<=top;l=r){
while(r<=top&&st[r]==st[l])++r;
sum*=fac[r-l];
}
sum=24/sum,res=mul(res,sum==24?12:sum);
return sum==24;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d",&n,&m),res=1;
fp(i,1,n)scanf("%s",s[i]+1);
ck();
fp(i,1,(n>>1)+(m>>1))fa[i]=i,sz[i]=1;
bin[0]=1;fp(i,1,(n>>1)+(m>>1))bin[i]=mul(bin[i-1],2);
fac[0]=1;fp(i,1,4)fac[i]=fac[i-1]*i;
fp(i,1,n>>1)fp(j,1,m>>1)
if(ck(i,j)){
R int u=find(i),v=find((n>>1)+j);
if(u!=v)fa[u]=v,sz[v]+=sz[u];
}
fp(i,1,(n>>1)+(m>>1))if(find(i)==i)res=mul(res,bin[sz[i]-1]);
printf("%d\n",res);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:53:27: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&n,&m),res=1;
^
./Main.cpp:54:29: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
fp(i,1,n)scanf("%s",s[i]+1);
^