B. Distinct Paths
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You have a rectangular n × m-cell board. Some cells are already painted some of k colors. You need to paint each uncolored cell one of the k colors so that any path from the upper left square to the lower right one doesn't contain any two cells of the same color. The path can go only along side-adjacent cells and can only go down or right.

Print the number of possible paintings modulo 1000000007 (109 + 7).

Input

The first line contains three integers n, m, k (1 ≤ n, m ≤ 1000, 1 ≤ k ≤ 10). The next n lines contain mintegers each — the board. The first of them contains m uppermost cells of the board from the left to the right and the second one containsm cells from the second uppermost row and so on. If a number in a line equals 0, then the corresponding cell isn't painted. Otherwise, this number represents the initial color of the board cell — an integer from 1 to k.

Consider all colors numbered from 1 to k in some manner.

Output

Print the number of possible paintings modulo 1000000007 (109 + 7).

Sample test(s)
input
2 2 4
0 0
0 0
output
48
input
2 2 4
1 2
2 1
output
0
input
5 6 10
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
output
3628800
input
2 6 10
1 2 3 4 5 6
0 0 0 0 0 0
output
4096

暴搜即可,有一个强力剪枝,对于当前所有未出现的颜色,接下来的状态是一致的,于是只用算一次就行了。

#include <bits/stdc++.h>
using namespace std;
namespace my_useful_tools {
#define rep(_i, _k, _j) for(int _i = _k; _i <= _j;++_i)
#define foreach(_i, _s) for(typeof(_s.begin()) _i = _s.begin(); _i != _s.end();++_i)
#define pb push_back
#define mp make_pair
#define ipir pair<int, int>
#define ivec vector<int>
#define clr(t) memset(t,,sizeof t)
#define pse(t, v) memset(t, v,sizeof t)
#define brl puts("")
#define file(x) freopen(#x".in","r", stdin), freopen(#x".out","w", stdout)
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef double DB;
inline void pc(char c) { putchar(c); }
template<class T> inline T gcd(T a, T b) { return b == ? a : gcd(b, a % b); }
template<class T> inline void W(T p) { if(p < ) pc('-'), p = -p; if(p / != ) W(p / ); pc('0' + p % ); } // warning!! slower than printf
template<class T> inline void Wn(T p) { W(p), brl; } template<class T> inline void W(T a, T b) { W(a), pc(' '), W(b); }
template<class T> inline void Wn(T a, T b) { W(a), pc(' '), Wn(b); }
template<class T> inline void W(T a, T b, T c) { W(a), pc(' '), W(b), pc(' '), W(c); }
inline char gchar() { char ret = getchar(); for(; ret == '\n' || ret == '\r' || ret == ' '; ret = getchar()); return ret; }
template<class T> inline void fr(T&ret) { char c = ' '; int flag = ; for(c = getchar(); c != '-' && !('0' <= c && c <= '9'); c = getchar());
if(c == '-') flag = -, ret = ; else ret = c - '0'; for(c = getchar(); '0' <= c && c <= '9'; c = getchar()) ret = ret * + c - '0';
ret = ret * flag;
}
inline int fr() { int x; fr(x); return x; }
template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); } template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
template<class T> inline T fast_pow(T base, T index, T mod = , T ret = ) {
for(; index; index >>= , base = base * base % mod) if(index & ) ret = ret * base % mod;
return ret;
}
const int maxv = , maxe = ;
struct Edge {
int edge, head[maxv], to[maxe], next[maxe];
Edge() { edge = ; memset(head, -, sizeof head); }
void addedge(int u, int v) {
to[edge] = v, next[edge] = head[u];
head[u] = edge++;
}
};
};
using namespace my_useful_tools; class DistinctPaths {
static const int mod = 1e9 + ;
static const int maxn = + ;
static const int maxs = << ;
int n, m, k;
int a[maxn][maxn], ans, log2[maxs], f[maxn][maxn];
int cnt[maxn];
int dfs(int x, int y) {
if(y == m + ) {
y = ;
++x;
}
if(x == n + ) {
return ;
}
int s = f[x - ][y] | f[x][y - ];
int ret = ;
int calced = -;
for(int t = (~s) & (( << k) - ); t; t -= t & (-t)) {
int p = log2[t & -t] + ;
if(a[x][y] == || a[x][y] == p) {
++cnt[p];
f[x][y] = s | (t & -t);
if(cnt[p] == ) {
if(calced == -) calced = dfs(x, y + );
ret += calced;
} else if(cnt[p]) {
ret += dfs(x, y + );
}
--cnt[p];
if(ret >= mod) ret -= mod;
}
}
return ret;
}
int solve() {
fr(n, m, k);
if(k < n + m - )
return ;
rep(i, , n) rep(j, , m)
fr(a[i][j]), ++cnt[a[i][j]];
rep(i, , k) log2[ << i] = i;
return dfs(, );
} public:
void run() {
Wn(solve());
}
} solver; int main() {
solver.run(); return ;
}

CF293B. Distinct Paths的更多相关文章

  1. CF293B Distinct Paths题解

    CF293B Distinct Paths 题意 给定一个\(n\times m\)的矩形色板,有kk种不同的颜料,有些格子已经填上了某种颜色,现在需要将其他格子也填上颜色,使得从左上角到右下角的任意 ...

  2. CF293B Distinct Paths 搜索

    传送门 首先数据范围很假 当\(N + M - 1 > K\)的时候就无解 所以对于所有要计算的情况,\(N + M \leq 11\) 超级小是吧,考虑搜索 对于每一个格子试填一个数 对于任意 ...

  3. [codeforces 293]B. Distinct Paths

    [codeforces 293]B. Distinct Paths 试题描述 You have a rectangular n × m-cell board. Some cells are alrea ...

  4. [CF293B]Distinct Paths_搜索_剪枝

    Distinct Paths 题目链接:http://codeforces.com/problemset/problem/293/B 数据范围:略. 题解: 带搜索的剪枝.... 想不到吧..... ...

  5. Codeforces 293B Distinct Paths DFS+剪枝+状压

    目录 题面 题目链接 题意翻译 输入输出样例 输入样例#1 输出样例#1 输入样例#2 输出样例#2 输入样例#3 输出样例#3 输入样例#4 输出样例#4 说明 思路 AC代码 总结 题面 题目链接 ...

  6. 考前停课集训 Day1 废

    [友情链接] Day1 今天模拟赛倒数…… 感觉自己菜到爆炸…… 被一个以前初一的倒数爆踩…… 感觉自己白学了. 满分400,自己只有100.真的是倒数第一…… 做了一个T2,其他暴力分全部没有拿到… ...

  7. uva 10564

    Problem FPaths through the HourglassInput: Standard Input Output: Standard Output Time Limit: 2 Seco ...

  8. Codeforce 水题报告

    最近做了好多CF的题的说,很多cf的题都很有启发性觉得很有必要总结一下,再加上上次写题解因为太简单被老师骂了,所以这次决定总结一下,也发表一下停课一星期的感想= = Codeforces 261E M ...

  9. 关于PJ 10.27

    题1 : Orchestra 题意: 给你一个 n*m 的矩阵,其中有一些点是被标记过的. 现在让你求标记个数大于 k 个的二维区间个数. n.m .k 最大是 10 . 分析: part 1: 10 ...

随机推荐

  1. Python【接口开发】

    import flaskimport json #步骤一:# __name__,代表当前这个python文件server = flask.Flask(__name__) #把咱们当前这个python文 ...

  2. addEventListener() 事件监听

    addEventListener() 用于向指定元素添加事件. 可以向一个元素添加多次事件或者多次不同事件,后面的事件是不会覆盖前面的. 语法: element.addEventListener(ev ...

  3. IOS取消performSelector警告

    #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks&quo ...

  4. 科学计算三维可视化---TVTK入门(创建和显示三维对象)

    一:创建一个基本的三维对象 (一)长方体操作 traits:就是TVTK对象的属性 (1)对象属性操作 >>> from tvtk.api import tvtk >>& ...

  5. Redis总体 概述,安装,方法调用

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...

  6. bzoj千题计划136:bzoj3931: [CQOI2015]网络吞吐量

    http://www.lydsy.com/JudgeOnline/problem.php?id=3931 在最短路网络上跑最大流 #include<queue> #include<c ...

  7. memcmp 和 memcpy使用

    #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> ...

  8. 随机森林入门攻略(内含R、Python代码)

    随机森林入门攻略(内含R.Python代码) 简介 近年来,随机森林模型在界内的关注度与受欢迎程度有着显著的提升,这多半归功于它可以快速地被应用到几乎任何的数据科学问题中去,从而使人们能够高效快捷地获 ...

  9. TED_Topic4:How I fell in love with quasars, blazars and our incredible universe

    By Jedidah Isler # Background about our speaker Jedidah Isler studies blazars(耀变天体) — supermassive h ...

  10. DockerFile指令集

     FROM            语法:FROM <image>[:<tag>]         解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile ...