package q77 var ( allocBuf []int allocP int ) func alloc(sz int) []int { if allocBuf == nil || allocP+sz > 8192 { allocP = 0 allocBuf = make([]int, 8192) } ret := allocBuf[allocP : allocP+sz] allocP += sz return ret } func combine(n int, k int) [][]int { buf := alloc(k) for i := range buf { buf[i] = i + 1 } sz := 1 for i := 1; i <= k; i++ { sz = sz * (n - i + 1) / i } ret := make([][]int, 0, sz) for { t := alloc(k) copy(t, buf) ret = append(ret, t) if buf[0] == n-k+1 { break } buf[k-1]++ i := k - 1 for ; i > 0 && buf[i] > n-(k-1-i); i-- { buf[i-1]++ } for i++; i < k; i++ { buf[i] = buf[i-1] + 1 } } return ret } var _ = combine