intuition solution

class Solution:
# time (N/M * M)  space O(1) if not consider output space 
    def distributeCandies(self, candies: int, num_people: int) -> List[int]:
        res = [0] * num_people
        ptr = 0
        round = 0
        gives = 0
        cnt = 0#round * num_people + index 
        # termination: candies - cnt <  cnt_next(cnt +1)
        while candies - cnt > gives:
            # reset if ptr reaches the end 
            if ptr == num_people:
                round += 1
                ptr = 0
            # current candies given out 
            gives =  ptr + 1 + round * num_people
            res[ptr] += gives
            cnt += gives
            ptr += 1
            
        if ptr < num_people :
            res[ptr] += candies - cnt 
        else:
            res[ptr-num_people]  +=  candies - cnt
        return res

optimize

class Solution:
    def distributeCandies(self, candies: int, num_people: int) -> List[int]:
        # time O(sqrt(candies)) O(N) N: num_people  ~ O(1) 
        res = [0] * num_people
        gives = 0
        while candies > 0:
            res[gives%num_people] += min(gives+1,candies)
            gives += 1
            candies -= gives 
        return res