```go
package main
import (
"bufio"
"fmt"
"os"
)
func powMod(a, e, mod int64) int64 {
a %= mod
if a < 0 {
a += mod
}
res := int64(1)
for e > 0 {
if e&1 == 1 {
res = res * a % mod
}
a = a * a % mod
e >>= 1
}
return res
}
func gcd(a, b int64) int64 {
if a < 0 {
a = -a
}
if b < 0 {
b = -b
}
for b != 0 {
a, b = b, a%b
}
return a
}
func norm(x, mod int64) int64 {
x %= mod
if x < 0 {
x += mod
}
return x
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var n, k, m int64
fmt.Fscan(in, &n, &k, &m)
if k%2 == 1 {
g := gcd(k, n-2)
ans := norm(powMod(k, n, m)-powMod(k-1, n, m), m)
t := (g - 1) % m
if n%2 == 0 {
ans = norm(ans-t, m)
} else {
ans = norm(ans+t, m)
}
fmt.Fprintln(out, ans)
} else {
c := gcd(k/2, n-2)
kp := powMod(k, n, m)
a := powMod(k-2, n, m)
b := powMod(m-2, n, m)
prod := ((c - 1) % m) * b % m
temp := norm(kp-a-prod, m)
inv2 := (m + 1) / 2
ans := temp * inv2 % m
fmt.Fprintln(out, ans)
}
}
```