bool isChecked(int fh, int fw, int i, int j){
	if( (fh&(1<<i))==0 && (fw&(1<<j))==0 )return true;
	else return false;
}

void main(){
	int h, w, k;
	readf("%d %d %d\n", &h, &w, &k);
	string[] table;
	foreach(i; 0..h){
		table ~= readln().chomp();
	}
	int cnt;
	// 塗りつぶしを行う行
	foreach(fill_h; 0..2^^h){
		// 塗りつぶしを行う列
		foreach(fill_w; 0..2^^w){
			// 塗りつぶし後の黒いマスの数え上げ
			int blkcell;
			foreach(i, line; table){
				foreach(j, c; line){
					if( isChecked(fill_h, fill_w, i.to!int(), j.to!int()) ){
						if(c=='#')blkcell++;
					}
				}
			}
			if(blkcell==k)cnt++;
		}
	}
	cnt.writeln();
}

import std.stdio, std.conv, std.algorithm, std.numeric, std.string, std.math;

// 1要素のみの入力
T _scan(T= int)(){
	return to!(T)( readln().chomp() );
}

// 1行に同一型の複数入力
T[] _scanln(T = int)(){
	T[] ln;
	foreach(string elm; readln().chomp().split()){
		ln ~= elm.to!T();
	}
	return ln;
}
