Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair <int, int> ii;
- const int Maxn = 10;
- const int Maxd = 11;
- const int mod = 1000000007;
- int a, b, c;
- vector <ll> un;
- vector <ii> V[Maxn][Maxd];
- ll ways[200005];
- int A[Maxn][Maxn];
- void Gen(int lvl, int from, ll cur)
- {
- if (lvl >= b) un.push_back(cur);
- else {
- for (int i = from; i >= 0; i--)
- Gen(lvl + 1, i, Maxd * cur + i);
- }
- }
- int main()
- {
- scanf("%d %d %d", &a, &b, &c);
- Gen(0, c, 0);
- sort(un.begin(), un.end());
- for (int i = 0; i < un.size(); i++) {
- ll num = un[i];
- ll pw = 1;
- for (int j = 0; j < b; j++) {
- int dig = num % Maxd; num /= Maxd;
- if (dig > 0) {
- int ind = lower_bound(un.begin(), un.end(), un[i] - pw) - un.begin();
- if (ind < un.size() && un[ind] == un[i] - pw)
- V[j][dig].push_back(ii(i, ind));
- }
- pw *= Maxd;
- }
- ways[i] = 1;
- }
- for (int i = 0; i < a; i++)
- for (int j = 0; j < b; j++)
- scanf("%d", &A[i][j]);
- for (int i = 0; i < a; i++) {
- for (int j = 0; j < un.size(); j++) {
- ll num = un[j];
- bool ok = true;
- for (int l = 0; l < b && ok; l++) {
- int dig = num % Maxd; num /= Maxd;
- ok = dig >= A[i][b - 1 - l];
- }
- if (!ok) ways[j] = 0;
- }
- if (i + 1 < a) {
- for (int j = 0; j < b; j++)
- for (int d = c; d > 0; d--)
- for (int l = 0; l < V[j][d].size(); l++) {
- ii p = V[j][d][l];
- ways[p.second] = (ways[p.second] + ways[p.first]) % mod;
- }
- }
- }
- int res = 0;
- for (int i = 0; i < un.size(); i++)
- res = (res + ways[i]) % mod;
- printf("%d\n", res);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement