← Home
For problem statement at 0-999/200-299/200-209/201/problemE.txt this is a correct solution, but verifier at 0-999/200-299/200-209/201/verifierE.go ends with All tests passed can you fix the verifier? package main

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

func combMin(n, r, cap int64) int64 {
	if r < 0 || r > n || cap <= 0 {
		return 0
	}
	if r > n-r {
		r = n - r
	}
	res := int64(1)
	for i := int64(1); i <= r; i++ {
		a := n - r + i
		res = res * a / i
		if res >= cap {
			return cap
		}
	}
	return res
}

func can(k, n, m int64) bool {
	if n <= 1 {
		return true
	}
	if k == 0 {
		return false
	}
	budget := k * m
	cnt := int64(1)
	ones := int64(0)

	for w := int64(1); w <= k && cnt < n; w++ {
		take := combMin(k, w, n-cnt)
		if take == 0 {
			break
		}
		add := w * take
		if add > budget-ones {
			return false
		}
		ones += add
		cnt += take
	}
	return cnt >= n && ones <= budget
}

func solve(n, m int64) int64 {
	if n == 1 {
		return 0
	}
	lo, hi := int64(0), n-1
	for lo < hi {
		mid := (lo + hi) / 2
		if can(mid, n, m) {
			hi = mid
		} else {
			lo = mid + 1
		}
	}
	return lo
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	for ; t > 0; t-- {
		var n, m int64
		fmt.Fscan(in, &n, &m)
		fmt.Fprintln(out, solve(n, m))
	}
}