← Home
package main

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

type Pair struct {
	core int64
	exp  int
}

func nextInt(data []byte, idx *int) int64 {
	n := len(data)
	for *idx < n && data[*idx] <= ' ' {
		*idx++
	}
	var v int64
	for *idx < n && data[*idx] > ' ' {
		v = v*10 + int64(data[*idx]-'0')
		*idx++
	}
	return v
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	t := int(nextInt(data, &idx))

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var pairs []Pair

	for ; t > 0; t-- {
		n := int(nextInt(data, &idx))
		x := nextInt(data, &idx)

		if cap(pairs) < n {
			pairs = make([]Pair, n)
		} else {
			pairs = pairs[:n]
		}

		for i := 0; i < n; i++ {
			v := nextInt(data, &idx)
			e := 0
			for v%x == 0 {
				v /= x
				e++
			}
			pairs[i] = Pair{core: v, exp: e}
		}

		sort.Slice(pairs, func(i, j int) bool {
			if pairs[i].core == pairs[j].core {
				return pairs[i].exp < pairs[j].exp
			}
			return pairs[i].core < pairs[j].core
		})

		var ans int64
		i := 0
		for i < n {
			core := pairs[i].core
			prevExp := -1 << 30
			var prev int64

			for i < n && pairs[i].core == core {
				exp := pairs[i].exp
				var cnt int64
				for i < n && pairs[i].core == core && pairs[i].exp == exp {
					cnt++
					i++
				}

				if exp > prevExp+1 {
					ans += prev
					prev = 0
				}

				if cnt >= prev {
					prev = cnt - prev
				} else {
					ans += prev - cnt
					prev = 0
				}

				prevExp = exp
			}

			ans += prev
		}

		fmt.Fprintln(out, ans)
	}
}