Задача Задача №3480182
А
А
Краткая идея:
- По регламенту команда состоит из трех игроков и должна иметь две равные рейтинги: формируем тройку вида (a, a, b), где a и b — положительные целые, b ≠ a, и сумма 2a + b равна S.
- Дополнительное условие тактики Михаила: ни один игрок не должен играть так же или лучше, чем двое других вместе взятых. Для нашего треугольника это означает, что рейтинг игрока с рейтингом b должен быть меньше суммы рейтингов двух остальных: b < 2a.
- Отсюда:
- b = S - 2a > 0, значит a <= floor((S-1)/2).
- b < 2a => S - 2a < 2a => a > S/4.
- Исключаем случай_ALL равных: b ≠ a, т.е. S ≠ 3a.
- Таким образом, искомые a лежат в диапазоне: a_min = floor(S/4) + 1, a_max = floor((S-1)/2), и исключаем те a, для которых S = 3a (то есть a = S/3, если S делится на 3).
Число таких команд равно:
- N = max(0, a_max - a_min + 1)
- если S % 3 == 0 и a_min <= S/3 <= a_max, то N -= 1
Такой подход работает за константное время и использует 64-битные целые.
Пример:
- S = 10: a_min = floor(10/4)+1 = 2+1 = 3, a_max = floor(9/2) = 4. N = 4-3+1 = 2. S не делится на 3, ответ 2. Совпадает с примером: (3,3,4) и (4,4,2).
Код (C++17, использует long long):
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long s;
if (!(cin >> s)) return 0;
long long amax = (s - 1) / 2; // floor((S-1)/2)
long long amin = s / 4 + 1; // floor(S/4) + 1
long long ans = 0;
if (amax >= amin) {
ans = amax - amin + 1;
if (s % 3 == 0) {
long long t = s / 3;
if (t >= amin && t <= amax) ans--;
}
}
cout << ans << "\n";
return 0;
}
Этот алгоритм корректен для любых S в рамках указанных ограничений и работает за константное время.