Floor Sum

Share:
 1func floorSum(n, m, a, b int) int {
 2	ans := 0
 3	if a >= m {
 4		ans += (n - 1) * n * (a / m) / 2
 5		a %= m
 6	}
 7	if b >= m {
 8		ans += n * (b / m)
 9		b %= m
10	}
11
12	yma := (a*n + b) / m
13	if yma == 0 {
14		return ans
15	}
16	xma := yma*m - b
17	ans += (n - (xma+a-1)/a) * yma
18	ans += floorSum(yma, a, m, (a-xma%a)%a)
19	return ans
20}
21