← Home
For problem statement at 1000-1999/1100-1199/1100-1109/1105/problemC.txt this is a correct solution, but verifier at 1000-1999/1100-1199/1100-1109/1105/verifierC.go ends with all tests passed can you fix the verifier? package main

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

const MOD int64 = 1000000007

func modAdd(a, b int64) int64 {
	a += b
	if a >= MOD {
		a -= MOD
	}
	return a
}

func modMul(a, b int64) int64 {
	return (a * b) % MOD
}

func countModInRange(l, r int64, m int64) int64 {
	if r < l {
		return 0
	}
	ll := l % 3
	total := r - l + 1
	base := total / 3
	rem := total % 3
	cnt := [3]int64{base, base, base}
	start := ll
	for i := int64(0); i < rem; i++ {
		cnt[start]++
		start = (start + 1) % 3
	}
	return cnt[m]
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var n int64
	var l, r int64
	if _, err := fmt.Fscan(in, &n, &l, &r); err != nil {
		return
	}

	c0 := countModInRange(l, r, 0)
	c1 := countModInRange(l, r, 1)
	c2 := countModInRange(l, r, 2)

	dp0, dp1, dp2 := int64(1), int64(0), int64(0)
	for i := int64(0); i < n; i++ {
		ndp0 := modAdd(modAdd(modMul(dp0, c0), modMul(dp1, c2)), modMul(dp2, c1))
		ndp1 := modAdd(modAdd(modMul(dp0, c1), modMul(dp1, c0)), modMul(dp2, c2))
		ndp2 := modAdd(modAdd(modMul(dp0, c2), modMul(dp1, c1)), modMul(dp2, c0))
		dp0, dp1, dp2 = ndp0, ndp1, ndp2
	}

	fmt.Println(dp0 % MOD)
}