codeforces 293B

#include<bits/stdc++.h>
#define N 55
#define K 11
using namespace std;
const int MOD=1e9+7;
int jc[K],a[N][N];
int cu[N][N][K];
int cx[K];
int n,m,k,ans,zy;
inline int A(int n,int m){
	long long tmp=1;
	for(int i=n;i>n-m;i--) tmp*=i;
	return int(tmp%MOD);
}
void dfs(int x,int y,int use,int ge){
	if(x==n){
		ans+=A(zy,ge);
		if(ans>=MOD) ans-=MOD;
		return;
	}
	if(y==m){
		dfs(x+1,0,use,ge);
		return;
	}
	if(a[x][y]){
		if(cu[x][y][a[x][y]]>2) return;
		dfs(x,y+1,use,ge);
		return;
	}
	int f=0;
	for(int c=1;c<=k;c++){
		if(f&&cx[c]==0) continue;
		if(!cx[c]) f=1;
		int fge=0;
		if(cu[x][y][c]) continue;
		if(cx[c]==0) fge=1;
		cx[c]++;
		for(int i=x;i<n;i++)
			for(int j=y;j<m;j++)
				cu[i][j][c]++;
		dfs(x,y+1,c,ge+fge);
		for(int i=x;i<n;i++)
			for(int j=y;j<m;j++)
				cu[i][j][c]--;
		cx[c]--;
	}
}
int main(){
	jc[0]=jc[1]=1;
	for(int i=2;i<=10;i++) jc[i]=jc[i-1]*i;
	scanf("%d%d%d",&n,&m,&k);
	if(n+m-1>k){
		puts("0");
		exit(0);
	}
	zy=k+1;
	memset(cx,0,sizeof(cx));
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++){
			scanf("%d",&a[i][j]);
			if(a[i][j]){
				for(int x=0;x<=i;x++)
					for(int y=0;y<=j;y++)
						cu[x][y][a[i][j]]++;
				for(int x=i;x<n;x++)
					for(int y=j;y<m;y++)
						cu[x][y][a[i][j]]++;
			}
			if(!cx[a[i][j]]){
				zy--;
			}
			cx[a[i][j]]=1;
		}
	
	dfs(0,0,0,0);
	printf("%d\n",ans);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章