#include<bits/stdc++.h>
using namespace std;

#pragma GCC optimize ("O3")
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
#define TIME cerr << "\nTime elapsed: " << setprecision(5) <<1000.0 * clock() / CLOCKS_PER_SEC << "ms\n";
#define FAST ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define PI 3.14159265358979323846
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound

typedef long long ll;
typedef pair<int, int> pi;
typedef pair<ll,ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef map<int, int> mi;
typedef map<ll, ll> ml;
#define fr(i, n) for (int i = 0; i < n; i++)

const int N = 5e5 + 5;
const int M = 998244353;
ll fact[N], inv[N];
vector<bool> prime;
vector<int> drow4{1, -1,  0,  0};
vector<int> dcol4{0,  0, -1,  1};
vector<int> drow8{0,  1,  1,  1,  0, -1, -1, -1};
vector<int> dcol8{1,  1,  0, -1, -1, -1,  0,  1};

void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
    cerr << "debug statement : " << *it << " = " << a << endl;
    err(++it, args...);
} 

ll powerModM(ll x, ll y){ 
    ll res = 1; 
    while(y){ 
        if(y & 1) 
            res=(res * x)%M; 
        y = y >> 1; 
        x = (x *x) % M;
    } 
    return res % M; 
}

ll power(ll x, ll y){ 
    ll res = 1; 
    while(y){ 
        if(y & 1) 
            res = res * x; 
        y = y >> 1; 
        x = x*x;
    } 
    return res; 
}
 
void preCalcFactorial(int n){
    fact[0] = inv[0] = 1;
    for(ll i = 1; i <= n; i++){
        fact[i] = (fact[i-1] * i) % M;
        inv[i] = powerModM(fact[i], M - 2);
    }
}
 
ll nCr(ll n,ll r){
    ll ans = ((fact[n] * inv[r]) % M + M) % M;
    ans = ((ans * inv[n-r]) % M + M) % M;
    return ans;
}

void sieve(int n) { 
    prime.resize(n+1, true);
    prime[1] = false;
    for (int p = 2; p * p <= n; p++){ 
        if (prime[p] == true) {
            for (int i = p*p; i <= n; i += p) 
                prime[i] = false; 
        } 
    }
} 

class BIT{
public:
    int size;
    vector<int> v;
    BIT(int s){
        size = s;
        v.resize(s, 0);
    }
    void update(int i, int delta){
        while(i < size){
            v[i] += delta;
            i += i & (-i);
        }
    }
    int sum(int i){
        int s = 0;
        while(i > 0){
            s += v[i];
            i -= i & (-i);
        }
        return s;
    }
};

void makeCombiUtil(vector<vector<int> >& ans, vector<int>& tmp, int n, int left, int k) 
{ 
    if (k == 0) { 
        ans.push_back(tmp); 
        return; 
    } 
    for (int i = left; i <= n; ++i) 
    { 
        tmp.push_back(i-1); 
        makeCombiUtil(ans, tmp, n, i + 1, k - 1); 
        tmp.pop_back(); 
    } 
} 
   
vector<vector<int> > makeCombi(int n, int k) 
{ 
    vector<vector<int> > ans; 
    vector<int> tmp; 
    makeCombiUtil(ans, tmp, n, 1, k); 
    return ans; 
} 

bool evaluate(vector<string> v, vector<int> row, vector<int> col, int k) {
	int rows = v.size(), cols = v[0].length(), count = 0;
	for(auto r : row) {
		for(int i = 0; i < cols; i++) {
			v[r][i] = '.';
		}
	}
	for(auto c : col) {
		for(int i = 0; i < rows; i++) {
			v[i][c] = '.';
		}
	}
	fr(i, rows) {
		fr(j, cols) {
			if(v[i][j] == '#') count++;
		}
	}
	if(count == k) return true;
	return false;
}

void testCase(){
    int n, m, k;
	cin >> n >> m >> k;
	vector<string> v(n);
	fr(i, n) cin >> v[i];
	int count = 0;
	for(int i = 0; i <= n; i++) {
		for(int j = 0; j <= m; j++) {
			vector<vi> rows = makeCombi(n, i);
			vector<vi> cols = makeCombi(m, j);
			for(auto r : rows) {
				for(auto c : cols) {
					if(evaluate(v, r, c, k)) count++;
				}
			}
		}
	}
	cout << count << endl;
}

int main(){
    FAST
    int t = 1;
    //cin >> t;
    while(t--){
        testCase();
    }
}


Measured memory_bytes: 3664