← Home
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.ParseInt(scanner.Text(), 10, 64)
	
	scanner.Scan()
	k, _ := strconv.ParseInt(scanner.Text(), 10, 64)
	
	scanner.Scan()
	m, _ := strconv.ParseInt(scanner.Text(), 10, 64)

	type Block struct {
		val   int64
		count int64
	}

	var S []Block
	for i := int64(0); i < n; i++ {
		scanner.Scan()
		v, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		
		if len(S) > 0 && S[len(S)-1].val == v {
			S[len(S)-1].count++
			if S[len(S)-1].count == k {
				S = S[:len(S)-1]
			}
		} else {
			S = append(S, Block{val: v, count: 1})
		}
	}

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

	L := int64(0)
	for _, b := range S {
		L += b.count
	}

	i := 0
	j := len(S) - 1

	for i < j && S[i].val == S[j].val && (S[i].count+S[j].count)%k == 0 {
		i++
		j--
	}

	if i == j {
		rem := (m * S[i].count) % k
		if rem == 0 {
			fmt.Println(0)
		} else {
			ans := int64(0)
			for t := 0; t < i; t++ {
				ans += S[t].count
			}
			for t := j + 1; t < len(S); t++ {
				ans += S[t].count
			}
			ans += rem
			fmt.Println(ans)
		}
	} else {
		remPerBoundary := int64(0)
		for t := 0; t < i; t++ {
			remPerBoundary += S[t].count
		}
		for t := j + 1; t < len(S); t++ {
			remPerBoundary += S[t].count
		}
		if S[i].val == S[j].val {
			remPerBoundary += (S[i].count + S[j].count) - (S[i].count+S[j].count)%k
		}
		ans := m*L - (m-1)*remPerBoundary
		fmt.Println(ans)
	}
}