func productExceptSelfLong(nums []int) []int {
	l := len(nums)
	ans := make([]int, l)
	zero := false
	zeroIdx, product := -1, 1
	for i := 0; i < l; i++ {
		if nums[i] != 0 {
			product *= nums[i]
		} else {
			if zero {
				return ans
			}
			zero = true
			zeroIdx = i
		}
	}
	if zero {
		ans[zeroIdx] = product
		return ans
	}
	for i := 0; i < l; i++ {
		ans[i] = product / nums[i]
	}
	return ans
}

func productExceptSelf(nums []int) []int {
	l := len(nums)
	ans := make([]int, l)
	memset(ans, 1)
	for i := 1; i < l; i++ {
		ans[i] = ans[i-1] * nums[i-1]
	}
	for i, tmp := l-2, 1; 0 <= i; i-- {
		tmp *= nums[i+1]
		ans[i] *= tmp
	}
	return ans
}

func memset(a []int, v int) {
	a[0] = v
	l := len(a)
	for bp := 1; bp < l; bp *= 2 {
		copy(a[bp:], a[:bp])
	}
}