← Home
package main

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

type Node struct {
	child [2]int32
	cnt   int32
	ones  [30]int32
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n int
	var m int64
	if _, err := fmt.Fscan(reader, &n, &m); err != nil {
		return
	}
	if m == 0 {
		fmt.Println(0)
		return
	}
	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	nodes := make([]Node, n*31+2)
	var nodeCount int32 = 1

	for _, x := range a {
		u := int32(1)
		nodes[u].cnt++
		for p := 0; p < 30; p++ {
			if ((x >> p) & 1) == 1 {
				nodes[u].ones[p]++
			}
		}
		for i := 29; i >= 0; i-- {
			b := (x >> i) & 1
			if nodes[u].child[b] == 0 {
				nodeCount++
				nodes[u].child[b] = nodeCount
			}
			u = nodes[u].child[b]
			nodes[u].cnt++
			for p := 0; p < 30; p++ {
				if ((x >> p) & 1) == 1 {
					nodes[u].ones[p]++
				}
			}
		}
	}

	countGreaterOrEqual := func(K int) int64 {
		var cnt int64
		for _, x := range a {
			u := int32(1)
			for i := 29; i >= 0; i-- {
				if u == 0 {
					break
				}
				bx := (x >> i) & 1
				bk := (K >> i) & 1
				if bk == 0 {
					v := nodes[u].child[bx^1]
					if v != 0 {
						cnt += int64(nodes[v].cnt)
					}
					u = nodes[u].child[bx]
				} else {
					u = nodes[u].child[bx^1]
				}
			}
			if u != 0 {
				cnt += int64(nodes[u].cnt)
			}
		}
		return cnt
	}

	low, high := 0, (1<<30)-1
	ansK := 0
	for low <= high {
		mid := low + (high-low)/2
		if countGreaterOrEqual(mid) >= 2*m {
			ansK = mid
			low = mid + 1
		} else {
			high = mid - 1
		}
	}

	var sum int64
	var cnt int64
	for _, x := range a {
		u := int32(1)
		for i := 29; i >= 0; i-- {
			if u == 0 {
				break
			}
			bx := (x >> i) & 1
			bk := (ansK >> i) & 1
			if bk == 0 {
				v := nodes[u].child[bx^1]
				if v != 0 {
					c := int64(nodes[v].cnt)
					cnt += c
					for p := 0; p < 30; p++ {
						var ones int64
						if ((x >> p) & 1) == 0 {
							ones = int64(nodes[v].ones[p])
						} else {
							ones = c - int64(nodes[v].ones[p])
						}
						sum += ones << p
					}
				}
				u = nodes[u].child[bx]
			} else {
				u = nodes[u].child[bx^1]
			}
		}
	}

	rem := 2*m - cnt
	total := sum + rem*int64(ansK)
	total /= 2
	fmt.Println(total % 1000000007)
}