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)
}