← Home
For problem statement at 0-999/200-299/240-249/241/problemB.txt this is a correct solution, but verifier at 0-999/200-299/240-249/241/verifierB.go ends with test 1 failed: expected 25 got 22

exit status 1 can you fix the verifier? package main

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

const MOD int64 = 1000000007
const MAXB = 30

var (
	n, m int
	a    []int
	pref [MAXB + 1][]int
	pow2 [MAXB + 1]int64
)

func binFirstOne(l, r, bit int) int {
	mask := 1 << bit
	lo, hi := l, r
	for lo < hi {
		m := (lo + hi) >> 1
		if (a[m] & mask) == 0 {
			lo = m + 1
		} else {
			hi = m
		}
	}
	return lo
}

func onesInRange(bit, l, r int) int {
	return pref[bit][r] - pref[bit][l]
}

func sumAllWithin(l, r, bit int) (int64, int64) {
	sz := r - l
	if sz < 2 || bit < 0 {
		return 0, 0
	}
	cnt := int64(sz*(sz-1)) / 2
	var sum int64 = 0
	for j := 0; j <= bit; j++ {
		ones := int64(onesInRange(j, l, r))
		zeros := int64(sz) - ones
		sum += ones * zeros * pow2[j]
	}
	return cnt, sum
}

func sumAllCross(l1, r1, l2, r2, bit int) (int64, int64) {
	n1 := r1 - l1
	n2 := r2 - l2
	if n1 == 0 || n2 == 0 || bit < 0 {
		return 0, 0
	}
	cnt := int64(n1) * int64(n2)
	var sum int64 = 0
	for j := 0; j <= bit; j++ {
		onesA := int64(onesInRange(j, l1, r1))
		onesB := int64(onesInRange(j, l2, r2))
		zerosA := int64(n1) - onesA
		zerosB := int64(n2) - onesB
		sum += (onesA*zerosB + zerosA*onesB) * pow2[j]
	}
	return cnt, sum
}

func dfsCross(l1, r1, l2, r2, bit, K int) (int64, int64) {
	if l1 >= r1 || l2 >= r2 || bit < 0 {
		return 0, 0
	}
	mid1 := binFirstOne(l1, r1, bit)
	mid2 := binFirstOne(l2, r2, bit)
	if ((K>>bit)&1) == 0 {
		c1, s1 := dfsCross(l1, mid1, l2, mid2, bit-1, K)
		c2, s2 := dfsCross(mid1, r1, mid2, r2, bit-1, K)
		return c1 + c2, s1 + s2
	} else {
		c1, s1 := sumAllCross(l1, mid1, l2, mid2, bit-1)
		c2, s2 := sumAllCross(mid1, r1, mid2, r2, bit-1)
		c3, s3 := dfsCross(l1, mid1, mid2, r2, bit-1, K)
		c4, s4 := dfsCross(mid1, r1, l2, mid2, bit-1, K)
		return c1 + c2 + c3 + c4, s1 + s2 + s3 + s4
	}
}

func dfsWithin(l, r, bit, K int) (int64, int64) {
	sz := r - l
	if sz < 2 || bit < 0 {
		return 0, 0
	}
	mid := binFirstOne(l, r, bit)
	if ((K>>bit)&1) == 0 {
		c1, s1 := dfsWithin(l, mid, bit-1, K)
		c2, s2 := dfsWithin(mid, r, bit-1, K)
		return c1 + c2, s1 + s2
	} else {
		c1, s1 := sumAllWithin(l, mid, bit-1)
		c2, s2 := sumAllWithin(mid, r, bit-1)
		c3, s3 := dfsCross(l, mid, mid, r, bit-1, K)
		return c1 + c2 + c3, s1 + s2 + s3
	}
}

func computeLess(K int, totalPairs int64, sumAll int64) (int64, int64) {
	if K <= 0 {
		return 0, 0
	}
	if K >= (1 << MAXB) {
		return totalPairs, sumAll
	}
	return dfsWithin(0, n, MAXB-1, K)
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	if _, err := fmt.Fscan(in, &n, &m); err != nil {
		return
	}
	a = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}
	sort.Ints(a)

	for j := 0; j <= MAXB; j++ {
		pref[j] = make([]int, n+1)
		for i := 0; i < n; i++ {
			pref[j][i+1] = pref[j][i]
			if ((a[i] >> j) & 1) == 1 {
				pref[j][i+1]++
			}
		}
		pow2[j] = int64(1) << uint(j)
	}

	totalPairs := int64(n*(n-1)) / 2
	var sumAll int64 = 0
	for j := 0; j <= MAXB-1; j++ {
		ones := int64(pref[j][n])
		zeros := int64(n) - ones
		sumAll += ones * zeros * pow2[j]
	}

	if m == 0 {
		fmt.Fprintln(out, 0)
		return
	}
	if int64(m) == totalPairs {
		fmt.Fprintln(out, ((sumAll%MOD)+MOD)%MOD)
		return
	}

	kSmall := totalPairs - int64(m)

	lo, hi := 0, 1<<31
	for lo < hi {
		mid := (lo + hi) >> 1
		cnt, _ := computeLess(mid, totalPairs, sumAll)
		if cnt >= kSmall {
			hi = mid
		} else {
			lo = mid + 1
		}
	}
	Tplus1 := lo
	T := Tplus1 - 1

	var sumSmall int64
	if kSmall == 0 {
		sumSmall = 0
	} else {
		cntLT, sumLT := computeLess(T, totalPairs, sumAll)
		remain := kSmall - cntLT
		sumSmall = sumLT + remain*int64(T)
	}

	ans := (sumAll - sumSmall) % MOD
	if ans < 0 {
		ans += MOD
	}
	fmt.Fprintln(out, ans)
}