← Home
For problem statement at 0-999/500-599/550-559/551/problemD.txt this is a correct solution, but verifier at 0-999/500-599/550-559/551/verifierD.go ends with All 100 tests passed can you fix the verifier?  ```go
package main

import (
	"fmt"
)

func main() {
	var n, k, l, m int64
	fmt.Scan(&n, &k, &l, &m)

	if m == 1 {
		fmt.Println(0)
		return
	}

	if l < 64 && k >= (int64(1)<<l) {
		fmt.Println(0)
		return
	}

	f0 := fib(n+2, m)
	pow2n := modPow(2, n, m)
	f1 := pow2n - f0
	if f1 < 0 {
		f1 += m
	}

	var ones int64
	for i := int64(0); i < l; i++ {
		if (k>>i)&1 == 1 {
			ones++
		}
	}
	zeros := l - ones

	ans := modPow(f0, zeros, m)
	ans = (ans * modPow(f1, ones, m)) % m
	fmt.Println(ans)
}

func modPow(base, exp, mod int64) int64 {
	res := int64(1)
	base %= mod
	for exp > 0 {
		if exp&1 == 1 {
			res = (res * base) % mod
		}
		base = (base * base) % mod
		exp >>= 1
	}
	return res
}

func fib(n, mod int64) int64 {
	return fibPair(n, mod)[0]
}

func fibPair(n, mod int64) [2]int64 {
	if n == 0 {
		return [2]int64{0, 1}
	}
	p := fibPair(n>>1, mod)
	a, b := p[0], p[1]
	c := (a * ((2*b%mod - a + mod) % mod)) % mod
	d := (a*a%mod + b*b%mod) % mod
	if n&1 == 0 {
		return [2]int64{c, d}
	}
	return [2]int64{d, (c + d) % mod}
}
```