← Home
For problem statement at 0-999/500-599/580-589/587/problemB.txt this is a correct solution, but verifier at 0-999/500-599/580-589/587/verifierB.go ends with case 33 failed: expected 72972974 got 89867919
input:
19 235 10
69 268 189 664 198 24 469 305 781 951 651 948 318 309 69 432 452 382 357
exit status 1 can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

type Scanner struct {
	buf []byte
	pos int
}

func NewScanner() *Scanner {
	b, _ := io.ReadAll(os.Stdin)
	return &Scanner{buf: b, pos: 0}
}

func (s *Scanner) nextInt() int {
	for s.pos < len(s.buf) && s.buf[s.pos] <= ' ' {
		s.pos++
	}
	if s.pos >= len(s.buf) {
		return 0
	}
	res := 0
	for s.pos < len(s.buf) && s.buf[s.pos] > ' ' {
		res = res*10 + int(s.buf[s.pos]-'0')
		s.pos++
	}
	return res
}

func (s *Scanner) nextInt64() int64 {
	for s.pos < len(s.buf) && s.buf[s.pos] <= ' ' {
		s.pos++
	}
	if s.pos >= len(s.buf) {
		return 0
	}
	res := int64(0)
	for s.pos < len(s.buf) && s.buf[s.pos] > ' ' {
		res = res*10 + int64(s.buf[s.pos]-'0')
		s.pos++
	}
	return res
}

type Element struct {
	val int
	id  int
}

func main() {
	scanner := NewScanner()
	if scanner.pos >= len(scanner.buf) {
		return
	}
	n := scanner.nextInt()
	if n == 0 {
		return
	}
	l := scanner.nextInt64()
	k := scanner.nextInt()

	a := make([]int, n)
	elements := make([]Element, n)
	for i := 0; i < n; i++ {
		a[i] = scanner.nextInt()
		elements[i] = Element{val: a[i], id: i}
	}

	sort.Slice(elements, func(i, j int) bool {
		return elements[i].val < elements[j].val
	})

	rank := 0
	a[elements[0].id] = 0
	for i := 1; i < n; i++ {
		if elements[i].val > elements[i-1].val {
			rank++
		}
		a[elements[i].id] = rank
	}
	M := rank + 1

	ans := int64(0)
	MOD := int64(1000000007)
	f := make([]int64, n)
	for i := 0; i < n; i++ {
		f[i] = 1
	}

	L := l / int64(n)
	rem := int(l % int64(n))

	S := make([]int64, M)
	next_f := make([]int64, n)

	for j := 1; j <= k; j++ {
		blocksFull := L - int64(j) + 1
		if blocksFull < 0 {
			break
		}

		sumFull := int64(0)
		for i := 0; i < n; i++ {
			sumFull += f[i]
			if sumFull >= MOD {
				sumFull -= MOD
			}
		}

		sumPartial := int64(0)
		for i := 0; i < rem; i++ {
			sumPartial += f[i]
			if sumPartial >= MOD {
				sumPartial -= MOD
			}
		}

		if blocksFull > 0 {
			ans = (ans + (blocksFull%MOD)*sumFull) % MOD
		}
		if blocksFull >= 0 {
			ans = (ans + sumPartial) % MOD
		}

		if j == k {
			break
		}

		for i := 0; i < M; i++ {
			S[i] = 0
		}
		for i := 0; i < n; i++ {
			S[a[i]] += f[i]
			if S[a[i]] >= MOD {
				S[a[i]] -= MOD
			}
		}
		for i := 1; i < M; i++ {
			S[i] += S[i-1]
			if S[i] >= MOD {
				S[i] -= MOD
			}
		}
		for i := 0; i < n; i++ {
			next_f[i] = S[a[i]]
		}

		f, next_f = next_f, f
	}

	fmt.Println(ans)
}