function countFilled(m) {
  let count = 0 
  for(let i = 0; i < m.length; i++) {
    for(let j = 0; j < m[i].length; j++) {
      count += m[i][j] === '#' ? 1 : 0
    }
  }
  return count
}

function main(input) {
  const inputs =input.split('\n')
  const [H, W, N] = inputs[0].split(' ').map(Number)
  const M = inputs.slice(1).map(e => { return e.split('') })
  // console.log(M)

  // paint
  // 行
  let count = 0
  for(let i = 0; i < Math.pow(2, H); i++) {
    // console.log('M:', M)
    let currentM = JSON.parse(JSON.stringify(M))
    // 行塗りつぶし
    for (let ii = 0; ii < H; ii++) {
      // console.log('i:', i, 'ii:', ii, '1 << ii:', 1 << ii, 'i & ( 1 << ii )', i & ( 1 << ii ))
      if (i & ( 1 << ii )) {
        currentM[ii] = currentM[ii].map(e => { return '-' })
      }
    }
    // console.log('i:', i, 'currentM:', currentM)

    if (countFilled(currentM) < N) continue

    // 列

    for (let j = 0; j < Math.pow(2, W); j++) {
      let currentM2 = JSON.parse(JSON.stringify(currentM))
      for(let jj = 0; jj < W; jj++) {
        if (j & (1 << jj)) {
          for (let jji = 0; jji < H; jji++) {
            currentM2[jji][jj] = '-'
          }
        }
      }
      // console.log('i:', i, 'j:', j, 'currentM2:', currentM2)
      if (countFilled(currentM2) === N) count++
    }
  }
  console.log(count)
}

main(require('fs').readFileSync('/dev/stdin', 'utf8').trim())
