#include <iostream>
typedef long long ll;
using namespace std;
bool ll_is_valid(ll t, ll N, ll x, ll y)
{
return t / x + (t - x) / y >= N;
}
ll f(ll N, ll x, ll y)
{
ll R = 1;
while (!ll_is_valid(R,N,x,y)) R *= 2;
ll L = R / 2;
while(R - L > 1)
{
ll M = (L + R) / 2;
if (!ll_is_valid(M,N,x,y)) {L = M;}
else {R = M;}
}
return R;
}
int main()
{
ll N,x,y;
cin >> N >> x >> y;
if(x > y) swap( x, y );
cout << f(N, x, y) << std::endl;
}
∧ - логическое ИЛИ, ∨ - логическое И, ¬ - не что-то.
А и В принимают значения 0 (ложь) и 1 (истина) (здесь нам это не дано, надо просто сократить).
(A∧ ¬B)∨(¬A∧B)∧(A∨B) это
(A или не В) и (не А или В) или (А и В),
далее: (первые две скобки сократим, в данном случае надо чтобы хотя бы А или В имели любое значение)
(А или В) или (не А или не В) или (А и В)
то есть:
(А ∧ В) ∧ (¬А ∧ ¬В) ∧ (А ∨ В)
(но зачем нам А и В, когда есть А или В, то есть А и В становится бесполезным выражением, когда есть выражение, которому надо всего одно истинное значение)
и так:
(А или В) или (не А или не В)
то есть выражение всегда будет истинно, так как какое бы значение и имели А , В - выражение истинно.
Можно заменить это следующим:
А или не А или В или не В
А ∧ ¬А ∧ В ∧ ¬В
готово, а главное выражение всегда истинно!