← Home
For problem statement at 1000-1999/1800-1899/1800-1809/1808/problemE1.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1800-1809/1808/verifierE1.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
)

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

func countSums(n, k int, allowed []int, mod int64) []int64 {
	dp := make([]int64, k)
	ndp := make([]int64, k)
	dp[0] = 1
	for i := 0; i < n; i++ {
		for j := 0; j < k; j++ {
			ndp[j] = 0
		}
		for s, v := range dp {
			if v == 0 {
				continue
			}
			for _, d := range allowed {
				ns := s + d
				if ns >= k {
					ns -= k
				}
				ndp[ns] += v
				if ndp[ns] >= mod {
					ndp[ns] -= mod
				}
			}
		}
		dp, ndp = ndp, dp
	}
	return dp
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n, k int
	var m int64
	fmt.Fscan(in, &n, &k, &m)

	base := modPow(int64(k), int64(n-1), m)
	g := (2 - n) % k
	if g < 0 {
		g += k
	}

	var ans int64

	if k%2 == 1 {
		allowed := make([]int, 0, k-1)
		for d := 1; d < k; d++ {
			allowed = append(allowed, d)
		}
		dp := countSums(n, k, allowed, m)
		for x := 0; x < k; x++ {
			t := (g * x) % k
			add := base - dp[t]
			if add < 0 {
				add += m
			}
			ans += add
			if ans >= m {
				ans -= m
			}
		}
	} else {
		half := k / 2
		allowed := make([]int, 0, k-2)
		for d := 0; d < k; d++ {
			if d != 0 && d != half {
				allowed = append(allowed, d)
			}
		}
		dp := countSums(n, k, allowed, m)
		for x := 0; x < half; x++ {
			t := (g * x) % k
			add := base - dp[t]
			if add < 0 {
				add += m
			}
			ans += add
			if ans >= m {
				ans -= m
			}
		}
	}

	fmt.Println(ans % m)
}