#include <bits/stdc++.h>

using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using usize = std::size_t;
using namespace std;

#define rep(i, max) for(i32 i = 0; i < (i32)max; ++i)
#define loop while(true)
#define allOf(collection) collection.begin(), collection.end()

unique_ptr<string> readLine() { unique_ptr<string> line(new string()); getline(cin, *line); return line; }
template<typename T1, typename T2> pair<T1, T2> readPair() { T1 res1; cin >> res1; T2 res2; cin >> res2; readLine(); return make_pair(res1, res2);}
template<typename T> unique_ptr<vector<T>> readVector(usize num, bool isForIndex = false) { unique_ptr<vector<T>> list(new vector<T>(num)); rep(i, num) { cin >> (*list)[i]; if(isForIndex) --(*list)[i]; } readLine(); return list; }
void readValues() { readLine(); }
template<typename H, typename... T> void readValues(H& head, T&&... tails){ H a; cin >> a; head = a; readValues(forward<T>(tails)...); }
void writeLine() { cout << endl; }
template<typename T> void write(const T& arg) { cout << arg; }
template<typename T> void writeLine(const vector<T>& arg){ if(arg.empty()) { writeLine(); return; } write(arg[0]); for(int i = 1; i < arg.size(); ++i){ write(" "); write(arg[i]); } writeLine(); }
template<typename T> void writeLine(const T& arg) { cout << arg << endl; }
void recursiveCombination(vector<i32>& indexes, i32 s, i32 rest, function<void(vector<i32>&)> f) { if (rest == 0) { f(indexes); } else { if (s < 0) return; recursiveCombination(indexes, s - 1, rest, f); indexes[rest - 1] = s; recursiveCombination(indexes, s - 1, rest - 1, f); } }
void foreachWithCombination(i32 n, i32 k, function<void(vector<i32>&)> f) { auto indexes = vector<i32>(k); recursiveCombination(indexes, n - 1, k, f); }
void foreachWithPermutaton(i32 n, function<void(vector<i32>&)> f) { auto indexes = vector<i32>(); indexes.reserve(n); rep(i, (usize)n) indexes.push_back(i); do f(indexes); while (next_permutation(allOf(indexes))); }
void foreachWithPermutaton(i32 n, i32 k, function<void(vector<i32>&)> f){ foreachWithCombination(n, k, [=](vector<i32>& combIndexes){ foreachWithPermutaton(k, [=](vector<i32>& permIndexes){ auto indexes = vector<i32>(); indexes.reserve(k); rep(i, (usize)k){ indexes.push_back(combIndexes[permIndexes[i]]); } f(indexes); }); }); }
void program();
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    program();
}

void program() {
    i32 h, w, k;
    readValues(h, w, k);
    auto c = vector<string>();
    i32 blackCount = 0;
    rep(i, h) {
        c.push_back(*readLine());
        blackCount += count(allOf(c[i]), '#');
    }
    
    i32 result = 0;

    if(blackCount == k) ++result;

    for(i32 i = 1; i <= h; ++i) {
        foreachWithCombination(h, i, [&](vector<i32>& hIndexes) {
            i32 count = 0;
            for(const auto& hIndex: hIndexes){
                rep(i, w) {
                    if(c[hIndex][i] == '#') { 
                        ++count;
                    }
                }
            }
            if(blackCount - count == k) ++result;
        });
    }

    for(i32 j = 1; j <= w; ++j) {
        foreachWithCombination(w, j, [&](vector<i32>& wIndexes) {
            i32 count = 0;
            for(const auto& wIndex: wIndexes){
                rep(i, h) {
                    if(c[i][wIndex] == '#') {
                        ++count;
                    }
                }
            }
            if(blackCount - count == k) ++result;
        });
    }
    
    for(i32 i = 1; i <= h; ++i) {
        for(i32 j = 1; j <= w; ++j) {
            foreachWithCombination(h, i, [&](vector<i32>& hIndexes) {
                foreachWithCombination(w, j, [&](vector<i32>& wIndexes) {
                    i32 count = 0;
                    for(const auto& hIndex: hIndexes){
                        rep(i, w) {
                            if(c[hIndex][i] == '#') { 
                                ++count;
                                c[hIndex][i] = 'r';
                            }
                        }
                    }
                    for(const auto& wIndex: wIndexes){
                        rep(i, h) {
                            if(c[i][wIndex] == '#') {
                                ++count;
                            }
                        }
                    }
                    if(blackCount - count == k) ++result;
                    for(const auto& hIndex: hIndexes){
                        rep(i, w) {
                            if(c[hIndex][i] == 'r') { 
                                c[hIndex][i] = '#';
                            }
                        }
                    }
                });
            });
        }
    }
    writeLine(result);
}

Measured memory_bytes: 3692