```go
package main
import (
"bufio"
"fmt"
"os"
)
func modPow(a, e, mod 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 main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
var n int
var m int64
if _, err := fmt.Fscan(in, &n, &m); err != nil {
return
}
if n <= 0 {
fmt.Print(0)
return
}
inv2 := (m + 1) / 2
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)) % m
}
invFact[n] = modPow(fact[n], m-2, m)
for i := n; i >= 1; i-- {
invFact[i-1] = (invFact[i] * int64(i)) % m
}
C := func(nn, kk int) int64 {
if kk < 0 || kk > nn {
return 0
}
return (((fact[nn] * invFact[kk]) % m) * invFact[nn-kk]) % m
}
S := int64(0)
for k := 0; k <= n-1; k++ {
ck := C(n-1, k)
twoPow := modPow(2, int64(n-1-k), m)
mult := (ck * twoPow) % m
if k == n-1 {
S = (S + mult) % m
} else {
S = (S + (mult*inv2)%m) % m
}
}
ans := (fact[n] * S) % m
fmt.Print(ans)
}
```