参考1:http://blog.csdn.net/dpppbr/article/details/51972196
参考2:https://www.johannesbader.ch/2013/09/project-euler-problem-434-rigid-graphs/
[code]:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL MOD = 1e9+7;
int n,m;
LL dp[11][11],pw[101],C[11][11];
void preprocess(){
int i,j,ii,jj;
pw[0] = C[0][0] = 1;
for(i = 1;i <= 100;i++) pw[i] = (pw[i-1]*3)%MOD;
for(i = 1;i <= 10;i++){
C[i][0] = C[i][i] = 1;
for(j = 1;j < i;j++) C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
}
for(i = 1;i <= 10;i++){
for(j = 0;j <= 10;j++){
dp[i][j] = pw[i*j];
for(ii = 1;ii <= i;ii++){
for(jj = 0;jj <= j;jj++){
if(ii==i&&jj==j) continue;
dp[i][j] = (dp[i][j]-pw[(i-ii)*(j-jj)]*dp[ii][jj]%MOD
*C[i-1][ii-1]%MOD*C[j][jj]%MOD)%MOD;
}
}
}
}
}
int main(){
int i,j;
preprocess();
while(~scanf("%d%d",&n,&m)){
printf("%d\n",(dp[n][m]%MOD+MOD)%MOD);
}
return 0;
}