```go
package main
import (
"bufio"
"fmt"
"os"
)
const mod int64 = 1000000007
type FastScanner struct {
r *bufio.Reader
}
func NewFastScanner() *FastScanner {
return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}
func (fs *FastScanner) NextInt() int {
sign, val := 1, 0
c, err := fs.r.ReadByte()
for (c < '0' || c > '9') && c != '-' {
c, err = fs.r.ReadByte()
if err != nil {
return 0
}
}
if c == '-' {
sign = -1
c, _ = fs.r.ReadByte()
}
for c >= '0' && c <= '9' {
val = val*10 + int(c-'0')
c, err = fs.r.ReadByte()
if err != nil {
break
}
}
if err == nil {
_ = fs.r.UnreadByte()
}
return sign * val
}
func powmod(a, e int64) int64 {
res := int64(1)
for e > 0 {
if e&1 == 1 {
res = res * a % mod
}
a = a * a % mod
e >>= 1
}
return res
}
func isLucky(x int) bool {
for x > 0 {
d := x % 10
if d != 4 && d != 7 {
return false
}
x /= 10
}
return true
}
func main() {
in := NewFastScanner()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
n := in.NextInt()
k := in.NextInt()
cnt := make(map[int]int)
unlucky := 0
for i := 0; i < n; i++ {
x := in.NextInt()
if isLucky(x) {
cnt[x]++
} else {
unlucky++
}
}
fact := make([]int64, n+1)
invFact := make([]int64, n+1)
fact[0] = 1
for i := 1; i <= n; i++ {
fact[i] = fact[i-1] * int64(i) % mod
}
invFact[n] = powmod(fact[n], mod-2)
for i := n; i >= 1; i-- {
invFact[i-1] = invFact[i] * int64(i) % mod
}
comb := func(nn, rr int) int64 {
if rr < 0 || rr > nn {
return 0
}
return fact[nn] * invFact[rr] % mod * invFact[nn-rr] % mod
}
m := len(cnt)
lim := k
if m < lim {
lim = m
}
dp := make([]int64, lim+1)
dp[0] = 1
processed := 0
for _, c := range cnt {
up := processed
if up > lim-1 {
up = lim - 1
}
for j := up; j >= 0; j-- {
dp[j+1] = (dp[j+1] + dp[j]*int64(c)) % mod
}
processed++
}
ans := int64(0)
for j := 0; j <= lim; j++ {
ans += dp[j] * comb(unlucky, k-j) % mod
if ans >= mod {
ans -= mod
}
}
fmt.Fprintln(out, ans%mod)
}
```