В тупую можно подсчитать 2-мя вложенными циклами.
ans = 0;
for (i = 1; i <= 3; ++i) {
for (j = 1; j <= 3; ++j) {
mn = max(n - i - j - 3, 1);
mx = n - i - j - 1;
if (mn <= mx)
ans += mx - mn + 1;
}
}
Работает так - перебираем сколько символов в первом и втором блоке. После этого считаем, сколько минимально и максимально может быть символов в третьем блоке (оставляя на последний от 1 до 3 символов). Прибавляем к ответу количество возможных вариантов для длины третьего блока.
Но это если у вас параметры фиксированные (4 блока 1-3 символа). Если параметры могут меняться, то решение - динамическое программирование f(i,k) - сколько способов разбить первые i символов на k блоков.
База: f(0,0) = 1, f(0, k>0) = 0, f (i>0, 0) = 0;
Пересчет: f(i,k) = sum_{l=min_length...min(max_length, i)}(f(i-l,k-1)).
Ответ: f(n, num_blocks).