@sashx

Как найти общую формулу?

Здравствуйте! Встала такая задача: нужно найти количество подходящих недель из промежутка.

Дана тройка чисел: a, b, n. a a - начальная неделя. b - конечная неделя. n - принимает одно из значений {1,2,3}.

Например, если тройка:
35, 39, 1; то ответом будет 5 (подходящие номера недель 35,36,37,38,39).

35,39, 2 : то ответом будет 2 (подходящие номера недель 36,38).

35,39, 3 : то ответом будет 3 (подходящие номера недель 35,37,39).

Вопрос: а есть ли какая-то общая формула для произвольных a,b,n? Есть ли какая-то зависимость?
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
x mod min(n, 2) = ⌊n / 3⌋
Ответ написан
Комментировать
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
По идее надо бы задать формулу кусочно для разных n, но можно все собрать в одну формулу как-то так:
(2-n)(3-n)/2*f1(n) + (n-1)(3-n)*f2(n) + (n-1)(n-2)/2*f3(n)


Далее f1(n) = b-a+1

Для нахождения f2 и f3 можно сдвинуть левую границу вправо до первого числа нужной четности, а правую границу - влево. Потом уже зная, что 2 крайних числа в промежутке между a' и b' берутся, то фромула будет (b'-a')/2+1.

Для такого сдвига надо будет смотреть на четность a и b и четность n.

В итоге:
f2(n) = ((b-b%2)-(a+a%2))/2+1
f3(n) = ((b-1+b%2)-(a+1-a%2))/2+1

Можно f2 и f3 объединить используя n%2 и операцию xor: если четность a или b не такая же как у n, то надо границу сдвигать (вычесть/прибваить 1). Иначе надо вычесть/прибавить 0. xor как раз равен 1 при неравнестве и 0 при совпадении четностей.

f23(n) = ((a+(a%2 ^ n%2))-(b-(b%2)^(n%2)))/2+1

Итоговая формула:
(2-n)(3-n)/2*(b-a+1) + ((n-1)(3-n) + (n-1)(n-2)/2)*(((a+(a%2 ^ n%2))-(b-(b%2)^(n%2)))/2+1)


А еще, если пользоваться битовыми функциями, то можно вместо (n-1)(3-n) + (n-1)(n-2)/2 использовать (n & 2)/2, в вместо первой скобки (1 - (n & 2)/2)

Формула правильно возвращает 0, если чисел в промежутке нет. Правда, она не работает, если a > b.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы