For problem statement at 0-999/100-199/140-149/145/problemC.txt this is a correct solution, but verifier at 0-999/100-199/140-149/145/verifierC.go ends with All tests passed can you fix the verifier? package main
import (
"fmt"
"io"
"os"
)
const MOD int64 = 1000000007
func modPow(a, e int64) int64 {
r := int64(1)
for e > 0 {
if e&1 == 1 {
r = r * a % MOD
}
a = a * a % MOD
e >>= 1
}
return r
}
func isLucky(x int) bool {
for x > 0 {
d := x % 10
if d != 4 && d != 7 {
return false
}
x /= 10
}
return true
}
func main() {
data, _ := io.ReadAll(os.Stdin)
p := 0
nextInt := func() int {
for p < len(data) && (data[p] < '0' || data[p] > '9') {
p++
}
v := 0
for p < len(data) && data[p] >= '0' && data[p] <= '9' {
v = v*10 + int(data[p]-'0')
p++
}
return v
}
n := nextInt()
k := nextInt()
cnt := make(map[int]int)
unlucky := 0
for i := 0; i < n; i++ {
x := 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] = modPow(fact[n], MOD-2)
for i := n; i > 0; 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
}
limit := k
if len(cnt) < limit {
limit = len(cnt)
}
dp := make([]int64, limit+1)
dp[0] = 1
used := 0
for _, c := range cnt {
used++
up := used
if up > limit {
up = limit
}
for j := up; j >= 1; j-- {
dp[j] = (dp[j] + dp[j-1]*int64(c)) % MOD
}
}
ans := int64(0)
for t := 0; t <= limit; t++ {
ans = (ans + dp[t]*comb(unlucky, k-t)) % MOD
}
fmt.Println(ans)
}