← Home
```go
package main

import (
	"fmt"
)

func mul(a, b [2][2]int64, m int64) [2][2]int64 {
	var c [2][2]int64
	for i := 0; i < 2; i++ {
		for j := 0; j < 2; j++ {
			for k := 0; k < 2; k++ {
				c[i][j] = (c[i][j] + a[i][k]*b[k][j]) % m
			}
		}
	}
	return c
}

func powerMat(a [2][2]int64, b int64, m int64) [2][2]int64 {
	res := [2][2]int64{{1, 0}, {0, 1}}
	for b > 0 {
		if b%2 == 1 {
			res = mul(res, a, m)
		}
		a = mul(a, a, m)
		b /= 2
	}
	return res
}

func power(a int64, b int64, m int64) int64 {
	res := int64(1)
	a %= m
	for b > 0 {
		if b%2 == 1 {
			res = (res * a) % m
		}
		a = (a * a) % m
		b /= 2
	}
	return res
}

func main() {
	var n, k, l, m int64
	if _, err := fmt.Scan(&n, &k, &l, &m); err != nil {
		return
	}

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

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

	ans := int64(1)
	baseMat := [2][2]int64{{1, 1}, {1, 0}}
	mat := powerMat(baseMat, n+1, m)
	fn := mat[0][0]
	pow2 := power(2, n, m)

	for i := int64(0); i < l; i++ {
		bit := (k >> i) & 1
		if bit == 1 {
			ans = (ans * ((pow2 - fn + m) % m)) % m
		} else {
			ans = (ans * fn) % m
		}
	}

	fmt.Println(ans % m)
}
```