How do you evaluate how many times some loops will run, when you start to complicate the boundaries conditions? For example, take this function:
def f(n):
s = 0
for i in range(n):
for j in range(i, (n + i**2) // (n - i) + 1):
s += 1
return s
for i in range(10):
print(i, "->", f(i))
Output:
0 -> 0
1 -> 2
2 -> 5
3 -> 10
4 -> 17
5 -> 28
6 -> 42
7 -> 60
8 -> 83
9 -> 109
```