← Home
```go
package main

import (
	"bufio"
	"os"
	"sort"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	readInt := func() int {
		scanner.Scan()
		v, _ := strconv.Atoi(scanner.Text())
		return v
	}

	t := readInt()
	out := bufio.NewWriter(os.Stdout)

	for ; t > 0; t-- {
		n := readInt()
		u := make([]int, n)
		for i := 0; i < n; i++ {
			u[i] = readInt()
		}
		s := make([]int, n)
		for i := 0; i < n; i++ {
			s[i] = readInt()
		}

		univSkills := make(map[int][]int, n)
		for i := 0; i < n; i++ {
			univ := u[i]
			univSkills[univ] = append(univSkills[univ], s[i])
		}

		combined := make(map[int][]int64)
		for _, skills := range univSkills {
			sort.Slice(skills, func(a, b int) bool {
				return skills[a] > skills[b]
			})
			m := len(skills)
			if combined[m] == nil {
				combined[m] = make([]int64, m+1)
			}
			pref := combined[m]
			var sum int64
			for i, val := range skills {
				sum += int64(val)
				pref[i+1] += sum
			}
		}

		ans := make([]int64, n+1)
		for m, pref := range combined {
			for k := 1; k <= m; k++ {
				idx := m - (m % k)
				ans[k] += pref[idx]
			}
		}

		for i := 1; i <= n; i++ {
			if i > 1 {
				out.WriteByte(' ')
			}
			out.WriteString(strconv.FormatInt(ans[i], 10))
		}
		out.WriteByte('\n')
	}
	out.Flush()
}
```