Для данного N
все возможные различные прямоугольники:
1x1 1x2 1x3 1x4 ... 1x[N/1]
2x2 2x3 2x4 ... 2x[N/2] // 2x1 is equals to 1x2
3x3 3x4 ... 3x[N/3] // 3x1 and 3x2 are equal to 1x3 and 2x3
...
Mx[N/M]
Где [...]
означает целую часть (floor
) или, другими словами, [N/M]
равно целочисленное деление . Так как N
не очень большой, мы можем просто зациклить
C # Код:
private static int Solution(int value) {
int result = 0;
for (int i = 1; ; ++i) {
int upTo = value / i;
if (i > upTo)
return result;
result += (upTo - i + 1);
}
}
Демо:
int[] tests = new int[] {
0,
1,
6,
9,
10000,
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,5} -> {Solution(test),5}"));
Console.Write(report);
Результат:
0 -> 0
1 -> 1
6 -> 8
9 -> 13
10000 -> 46884