← Home
```go
package main

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

type Segment struct {
	city  int
	count int
}

func compress(segs []Segment, k int) []Segment {
	result := []Segment{}
	for _, s := range segs {
		if len(result) > 0 && result[len(result)-1].city == s.city {
			result[len(result)-1].count += s.count
		} else {
			result = append(result, s)
		}
		// remove multiples of k from last element
		if len(result) > 0 && result[len(result)-1].count%k == 0 {
			result = result[:len(result)-1]
		}
	}
	return result
}

func main() {
	reader := bufio.NewReader(os.Stdin)

	var n, k, m int
	fmt.Fscan(reader, &n, &k, &m)

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	// Build compressed segment representation of one bus trip
	oneBus := []Segment{}
	for i := 0; i < n; i++ {
		if len(oneBus) > 0 && oneBus[len(oneBus)-1].city == a[i] {
			oneBus[len(oneBus)-1].count++
		} else {
			oneBus = append(oneBus, Segment{a[i], 1})
		}
	}

	// Reduce within one bus
	oneBus = compress(oneBus, k)

	if len(oneBus) == 0 {
		fmt.Println(0)
		return
	}

	// Check if the bus trip can be merged with itself (head and tail merge)
	// We need to find the fixed point of repeating the bus
	// Strategy: simulate doubling until stable or m reached

	// We simulate by merging copies of oneBus together
	// But m can be up to 1e9, so we need binary lifting or cycle detection

	// Let's think differently:
	// Each copy of oneBus, when concatenated, the junction between copies might merge segments
	// We find what one "merged copy" looks like after stable repetition

	// Find the period: keep doubling the segment list until it stabilizes
	// But segment list could be large... 

	// Actually let's do binary lifting on the segment list
	// represent the effect of m copies

	// First check if oneBus is a single segment - special case
	// Let's do: simulate appending copies one by one until cycle detected
	// But m up to 1e9...

	// Binary lifting approach:
	// f(segs, count) = result of repeating segs count times

	// We'll use repeated squaring on the segment array

	// Helper: merge two segment arrays
	merge := func(left, right []Segment) []Segment {
		if len(left) == 0 {
			return right
		}
		if len(right) == 0 {
			return left
		}
		result := make([]Segment, len(left))
		copy(result, left)
		for _, s := range right {
			if len(result) > 0 && result[len(result)-1].city == s.city {
				result[len(result)-1].count += s.count
				if result[len(result)-1].count%k == 0 {
					result = result[:len(result)-1]
				}
			} else {
				result = append(result, s)
				if result[len(result)-1].count%k == 0 {
					result = result[:len(result)-1]
				}
			}
		}
		return result
	}

	// Binary exponentiation
	// We want oneBus repeated m times
	result := []Segment{}
	base := oneBus
	rem := m
	for rem > 0 {
		if rem%2 == 1 {
			result = merge(result, base)
		}
		base = merge(base, base)
		rem /= 2
	}

	total := 0
	for _, s := range result {
		total += s.count
	}
	fmt.Println(total)
}
```