Суть такого свойства алгоритма как понятность заключается в том, что: *
1. записывая алгоритм для конкретного исполнителя, можно использовать лишь те команды, что входят в систему его команд;
2. алгоритм должен иметь дискретную структуру (должен быть разбит на последовательность отдельных шагов);
3. при точном исполнении всех команд алгоритма процесс должен прекратиться за конечное число шагов, приведя к определенному результату;
4. исполнитель алгоритма не должен принимать решения, не предусмотренные составителем алгоритма.
5. алгоритм должен обеспечивать решение не одной конкретной задачи, а некоторого класса задач данного типа;
#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;
}
Из нечетных вычли 1 (получилось четное число), к четным прибавили 1 (нечётное). Отменяем это: к четным прибавляем 1, от нечётных отнимаем.
3216 -> 2307
Третья цифра была сдвинута на 3, при этом поменяв свою четность. 2 - четное число, значит, исходное число было нечётным и было сдвинуто на 3 влево. Отменяем, сдвигаем на 3 вправо: 2 -> 3 -> 4 -> 5.
Вторая цифра была сдвинута на 2, чётность не меняла, была и осталась нечётной. Она была сдвинута на 2 разряда влево, нам надо сдвинуть на 2 вправо: 3 -> 4 -> 5.
Первая цифра сейчас чётная (0), значит, была нечётной, её сдвинули на 1 влево. Сдвигаем на 1 вправо: 0 -> 1.
Нулевая цифра была сдвинута на 0 разрядов, поэтому осталась без изменений. Это цифра 7.
Искомый пароль: 5517.
(Ну и на всякий случай: не надо ставить такие простые пароли, не будьте, как Вася!)