Решение задач на С++
Задача A. Список квадратов
Выведите все точные квадраты натуральных чисел, не превосходящие данного числа N.
- int n;
- cin>>n;
- int value = 1;
- int curSqr = value * value ;
- while (curSqr<=n)
- <
- cout<<curSqr<< ‘ ‘ ;
- value ++;
- curSqr = value * value ;
- >
Задача B. Минимальный делитель
Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.
- int n;
- cin >> n;
- int i = 2, min_den = 1;
- int sqrt_n = sqrt(( double )n);
- while (i <= sqrt_n)
- <
- if (n % i == 0)
- <
- min_den = i;
- break ;
- >
- i++;
- >
- if (min_den == 1)
- cout << n;
- else
- cout << min_den;
Задача C. Список степеней двойки
По данному числу N распечатайте все целые степени двойки, не превосходящие N, в порядке возрастания. Операцией возведения в степень пользоваться нельзя!
- int n;
- cin >> n;
- int pow2 = 1;
- while (pow2 <= n)
- <
- cout << pow2 << ‘ ‘ ;
- pow2 *=2;
- >
Той же самой цели можно добиться, заменив явное умножение на 2 побитовым сдвигом.
Вариант 2.
- int n;
- cin >> n;
- int pow2 = 1;
- while (pow2 <= n)
- <
- cout << pow2 << ‘ ‘ ;
- pow2 <<= 1;
- >
Задача D. Точная степень двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя!
- int n;
- cin>>n;
- int bitAmount = 0;
- while (n) <
- bitAmount += n % 2;
- n /= 2;
- >
- if (bitAmount == 1)
- cout<< "YES" ;
- else
- cout<< "NO" ;
Задача E. Двоичный логарифм
По данному натуральному числу N выведите такое наименьшее целое число k, что 2 k ≥N.
Операцией возведения в степень пользоваться нельзя!
- int n;
- cin >> n;
- int pow2 = 1, k = 0;
- while (pow2 < n)
- <
- pow2 <<=1;
- k++;
- >
- cout << k;
Задача F. Утренняя пробежка
В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.
Программа получает на вход действительные числа x и y и должна вывести одно натуральное число.
- double x, y;
- cin >> x >> y;
- int k = 1;
- while (x < y)
- <
- x *= 1.1;
- k++;
- >
- cout << k;
Задача G. Банковские проценты
Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Каждый год сумма вклада становится больше. Определите, через сколько лет вклад составит не менее y рублей.
Программа получает на вход три натуральных числа: x, p, y и должна вывести одно целое число.
- double x,p,y;
- int years = 0;
- cin>>x>>p>>y;
- while (x<y) <
- x *= (1 + p/100.0);
- x *= 100;
- x = ( int ) x;
- x /= 100;
- years++;
- >
- cout<<years;
- int n, i = 2, f1 = 0, f2 = 1, cur;
- cin >> n;
- while (i <= n)
- <
- cur = f1 + f2;
- f1 = f2;
- f2 = cur;
- i++;
- >
- if (n<=1)
- cout<<n;
- else
- cout << cur;
Задача I. Номер числа Фибоначчи
Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1.
- int a, i = 1, f1 = 0, f2 = 1, cur = 1;
- cin >> a;
- while (cur < a)
- <
- cur = f1 + f2;
- f1 = f2;
- f2 = cur;
- i++;
- >
- if (cur == a)
- cout << i;
- else
- cout << -1;
Задача J. Исполнитель Раздвоитель
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка.
Дано два натуральных числа A и B (A>B). Напишите алгоритм для Раздвоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2.
- int a, b;
- cin >> a >> b;
- while (a > b)
- <
- if (a % 2 == 0 && a / 2 >= b)
- <
- cout << ":2" << endl;
- a /= 2;
- >
- else
- <
- cout << -1 << endl;
- a—;
- >
- >
Задача K. Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также кран с водой. Водолей может выполнять следующие операции:
Наполнить сосуд A (обозначается >A).
Наполнить сосуд B (обозначается >B).
Вылить воду из сосуда A (обозначается A>).
Вылить воду из сосуда B (обозначается B>).
Перелить воду из сосуда A в сосуд B (обозначается как A>B).
Перелить воду из сосуда B в сосуд A (обозначается как B>A).
Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью опустошается, либо второй сосуд полностью наполняется.
Программа получает на вход три натуральных числа A, B, N, не превосходящих 10 4 Вам необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible. Количество операций в алгоритме не должно превышать 10 5 . Гарантируется, что если задача имеет решение, то есть решение, которое содержит не более, чем 10 5 операций.
По данному натуральному числу N выведите такое наименьшее целое число k, что 2k≥N — Free Pascal
Дано количество секунд (от 1 до 1000000), которые работает генератор после включения.
Формат выходного файла
Результат работы генератора
5-1 2 2 3 3 2-1 2 5) В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров. Программа получает на вход действительные числа x и y и должна вывести одно натуральное число. Пример 10 20 Вывод 9 6) Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Каждый год сумма вклада становится больше. Определите, через сколько лет вклад составит не менее y рублей. Программа получает на вход три натуральных числа: x, p, y и должна вывести одно целое число. 7) Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1.
18. Оператор цикла while
Цикл с предусловием while позволяет выполнить многократно последовательность действий пока условие нахождения в цикле истинно (true). При этом условие записывается до самого тела цикла и проверяется до выполнения тела цикла.
При выполнении цикла while сначала проверяется условие нахождения в цикле. Если оно ложно, то цикл не выполняется ни разу, и управление передастся на следующую инструкцию после тела цикла while. Если условие истинно, то выполняется вложенный блок кода, после чего условие проверяется снова и снова выполняется вложенный блок кода. Так будет продолжается до тех пор, пока условие будет истинно (true). Как только условие станет ложно (false), работа цикла завершится и управление передастся следующему блоку кода после цикла.
Запомним, что если условие нахождения в цикле окажется ложным при первой проверке, то цикл не выполнится ни разу.
Слово while переводится, как «пока», и цикл «пока» продолжает выполнятся до тех пор, пока истинно условие нахождения в цикле. Рассмотрим пример, который выводит на экран числа больше пяти, но меньшие 10:
— инициализируем с присваиванием переменной int значения 6;
— заходя в цикл, необходимо проверить, является ли условие истинным, то есть i меньше 10;
— если меньше, то заходим в цикл, выводим i и инкрементируем на единицу, переходим к условию вхождения;
— если больше или равно, то в цикл не заходим.
Мы можем использовать сокращенную форму цикла, при условии, что в теле цикла будет находиться только одна инструкция:
Цикл while сильно схож с условным оператором if, но если if выполняет блок действий один раз, то цикл while будет делать их до тех пор, пока выполнено условие нахождения в цикле.
Важно!
Используйте цикл while, когда заранее неизвестно количество итераций цикла.
Используйте цикл for, когда заранее известно точное количество итераций цикла.
Loop_25
Как переводится слово while?
Loop_26
Без использования среды программирования, определите, что выведет следующий код?
Решение: 10; 13; 16; 19; 21; — выводит от 10 до 23 с шагом 3
Loop_27
Без использования среды программирования, определите, что выведет следующий код?
Решение: 7; 5; 2; — выводит цифры числа
Loop_28
Без использования среды программирования, определите, что выведет следующий код?
Решение: 1; 3; 5; 9; 15; — выводит первые пять делителей числа number
Loop_29
Вставьте в пропуск условие, чтобы вывести «Hello World!» 9 раз на каждой новой строке с помощью цикла while.
Loop_30
Что нужно вставить вместо пропуска, чтобы получившаяся программа выводила все квадраты натуральных чисел, не превосходящие данное число n.
Loop_31
Без использования среды программирования, определите, что выведет следующий код?
Решение: 9 — находит количество четных чисел, от 9 до 27
Loop_32
Без использования среды программирования, определите, что выведет следующий код?
Решение: выводит первый делитель неравный единице
Loop_33
Без использования среды программирования, определите, что выведет следующий код, если ввести туда следующие входные данные: (18); (24); (17); (0); (30);
Решение: 18 – 2 6; 24 – 2 4 6 8 12; 17 – 0 ; 0 – 0; 30 – 2 6 10;
Выводит все четные делители кроме самого числа
Loop_34
Без использования среды программирования, определите, что выведет следующий ниндзя-код, если его написал настоящий ниндзя-программист:
Решение: программа находит факториал введенного числа
Loop_35
По данному натуральному числу n, определите, сколько раз n делится на 3 нацело.
В первую очередь принимаем целое число. Создадим переменную счетчик для хранения количества целых делений на 3. Далее, организуем цикл while с условием, что пока остаток от деления введенного числа на три будет равно нулю, то выполнять тело цикла, где будем делить введенное число на три и инкрементировать счетчик.
Или решим эту задачу циклом for:
Loop_36
По данному натуральному числу n, найти 2^n. Класс Math и цикл for не использовать.
Рассмотрим что такое 2^n это произведение двоек n раз 2*2*2…2, Такую задачу мы уже решали с помощью цикла for. Организуем цикл while с условием пока инициализированный счетчик меньше введенного пользователем числа и производим накопление значения произведения двоек.
Loop_37
По данному числу n распечатайте все целые степени двойки, не превосходящие n. Методы возведения в степень не использовать!
Решаем почти также как и задачу loop_36, где поставим другое условие вхождения в цикл: пока два в n степени меньше введенного числа. Где в теле цикла будем выводить значение два в степени и следом степень двойки увеличивать.
Loop_38
По данному натуральному числу n выведите такое наименьшее целое число k, что 2^k >=n. Методы возведения в степень не использовать!
Рассмотрим, что 2^n = 2*2*2…2. Организуем цикл while с условием, пока два в n степени меньше введенного числа. В теле цикла наращивать значение произведения двоек и инкрементировать показатель степени. Также, необходимо учитывать, что при введенном нуле в ответ нужно получить единицу,
Loop_39
Даны построчно два целых числа. Напишите программу, которая вычисляет наибольшее число, на которое делятся без остатка оба заданных числа.
Для начала разберемся, что такое НОД и как его найти. Придется вспомнить курс математики, где описан Алгоритм Евклида, который позволяет найти нам наибольший общий делитель чисел. Напишем, как это работает:
Если вышли из цикла, то выводим сумму полученных чисел numOne + numTwo, где одно число будет равно нулю, а другое наибольшим общим делителем.
Решение: 5 – выводит количество цифр числа плюс единица
Loop_41
Без использования среды программирования, определите, что выведет следующий фрагмент программы?
Решение: 8 9 4 3 – выводит цифры числа в обратном порядке
Loop_42
Дано целое число неизвестного значения. Посчитать сумму его цифр.
Для решения этой задачи нужно посчитать сумму цифр числа, при этом мы не знаем, сколько цифр в записи числа. Но мы знаем, как находить последнюю цифру числа — для этого достаточно получить остаток от деления на 10. Также мы знаем как отбросить последнюю цифру числа — для этого нужно поделить число нацело на 10. Эти два шага мы зациклим пока число не станет равно нулю (закончатся цифры числа).
Необходимо, также, учитывать, что число неограниченно по значению, и оно может быть огромным и/или отрицательным.
Решение аналогично предыдущему, только увеличивать будем счетчики если цифра будет равна пяти и семи. Обратим внимание на условие, где число может быть как положительным так и отрицательным.
Решение аналогично решению из loop_42, только после ввода числа, нам нельзя испортить его значение, поэтому инициализируем новую переменную c значением введенного числа. Обратим внимание на условие, где число может быть как положительным так и отрицательным, поэтому воспользуемся методом для получения абсолютного значения. После того, как найдем сумму всех цифр числа, сравним их отношение.
Loop_45
Дано число n. Получите зеркальное представление цифр числа n с учетом знака.
Получаем на ввод целое число. Так как строками мы пользоваться пока не умеем, будем делать составное форматирование вывода результата, выводим в той же строке, что и вводили число: если число меньше нуля то знак минус «-», иначе пробел « ». Далее начинаем разбирать число на цифры получением остатка при делении на 10, и последующим изменением числа делением нацело на 10, до тех пор пока число больше нуля. Стоит отметить, что число в условии цикла должно быть положительно, поэтому перед циклом выделим абсолютное значение введенного числа.
Loop_46
Из данного целого числа выбросите цифры 1 и 9, при этом порядок остальных цифр не меняется.
Получаем на ввод целое число. Создаем новую переменную для хранения значения введенного числа. Инициализируем множитель, который будет иметь значение мультипликатора для каждого разряда числа. Организуем цикл while, где, пока число больше нуля, сравниваем последнюю цифру с 1 и 9, и в ложной ситуации получаем новое число — суммируем последнюю цифру умноженную на множитель, множитель увеличиваем в 10 раз. В конце тела цикла число делим нацело на 10.
Loop_47
Дано целое число, определить является ли оно палиндромом.
Loop_48
Задан четырехзначный номер года, найдите наименьший номер года, который строго больше заданного и в котором все цифры различны.
Вспоминаем как необходимо перевести десятичное число в двоичное. Итак, число делим на 2 до тех пор пока частное не станет равно нулю, при этом, при каждом шаге деления выводим остаток от деления числа на два.
Рассмотрим следующее, к примеру, нам нужно перевести число 19 в правильное двоичное представление:
В итоге, у нас получилось двоичное представление числа 19, равное 10011. Обратное двоичное число — это число, полученное записыванием числа справа налево, где для числа 10011 обратное число равно 11001.
Из всего вышесказанного: принимаем целое число, организуем цикл с условием нахождения в нем когда число больше нуля, где выводим остаток от деления числа на два, и число делим нацело на два.
Необходимо учитывать, что число может быть равно нулю, а также может быть отрицательным, где будем использовать абсолютное значение числа.
Loop_50
Дано целое число n. Выведите количество единиц в его в двоичном представлении.
Почти предыдущая задача (loop_49), только с добавлением счетчика для найденных единичек в записи двоичного числа:
Решение довольно простое, но есть нюанс при вводе отрицательного числа. В условие цикла while необходимо поставить изменяемую переменную всегда большую нуля, и эту изменяемую делить так же как и введенную пользователем нацело на два. В теле цикла сделать форматированный вывод деления числа на два и получения остатка от деления числа на два.
Loop_52
Дано целое десятичное число n неограниченного значения. Получите новое число в двоичной системе счисления равной введенному n. Использовать строки, массивы, а также встроенные методы конвертации в двоичный код запрещено!
Решение совершенно не сложное, главное понять смысл перевода десятичных чисел в двоичные. Пять предыдущих задач мы переводили числа в двоичное представление. Теперь нужно решить задачу прямого перевода в двоичный код, Рассмотрим алгоритм:
Выполняем тело цикла пока число больше нуля:
- суммируем остаток от деления числа на два умноженный на множитель разряда;
- множитель умножаем на 10; число делим нацело на 2.
Обращаем внимание на возможное большое число и/или отрицательное.
Ниже приведены задания по теме для самостоятельного решения:
- При решении, разрешено пользоваться только циклом while!
- При решении не использовать пользовательские методы, циклы for, do while, конструкцию try-catch, массивы, строки;
- Значения в выводе на консоли должны быть только корректные;
- Алгоритм оптимизировать по скорости исполнения при малых значениях;
- Программа не должна критически останавливаться с ошибкой конвертирования данных;
- Интерфейс консольного приложения обязан быть опрятным и дружелюбным!
Home_75. Напишите программу, которая выводит «I am a code writer!» 119 раз, каждый раз на новой строке.
Home_76. Напишите программу, которая выводит только четные числа от -2 до -200.
Home_77. Напишите программу, которая выводит все четные числа на заданном отрезке.
Home_78. По данному натуральному числу x, выведите все его делители. Введенное x может иметь абсолютно любое значение.
Home_79. Выведите обратную последовательность чисел кратных 9 на отрезке от a до b, где неизвестно какая переменная больше.
Home_80. По данному числу n найдите те числа, где сумма цифр квадрата числа больше n. Введенное число может иметь абсолютно любое значение.
Home_81. Найти сумму введенных пользователем n чисел.
Home_82. Выведите количество натуральных делителей целого числа n, исключая 1 и само число. Введенное число может иметь абсолютно любое значение.
Home_83. Пользователь ввел n чисел. Найти сумму и количество отрицательных четных чисел. Введенное n может иметь абсолютно любое значение.
Home_84. Пользователь ввел n чисел. Найдите сумму чисел, которые больше 5, но меньше введенного 10.
Home_85. По данным n числам, определите количество чисел, оканчивающиеся на 5.
Home_86. По данным n числам, определить наличие нуля среди них.
Home_87. По данному числу n, найдите произведение четных чисел от 1 до n, или нечетных чисел если от n до 1, если n < 0.
Home_88. Написать программу для нахождения a в степени n, введенных построчно с клавиатуры. Не использовать методы класса Math. Введенные числа могут иметь абсолютно любые значения.
Home_89. По данным двум целым числа a и b, вычислите произведение чисел на отрезке от a до b. Не гарантируется, что a обязательно меньше b. Введенное число может иметь абсолютно любое значение.
Home_90.По данным построчно двум целым числам a и b, вычислите произведение чисел на отрезке от a до b, оканчивающихся на 7. Не гарантируется, что a будет меньше b. Введенные числа могут иметь абсолютно любые значения.
Home_91. При введенном любом целом n, найти значение факториала n (n!). Введенное число может иметь абсолютно любое значение.
Цикл While. Блок 1. Задачи на цикл While
Задача A. Список квадратов
Выведите все точные квадраты натуральных чисел, не превосходящие данного числа N.
- int n;
- cin>>n;
- int value = 1;
- int curSqr = value * value ;
- while (curSqr<=n)
- <
- cout<<curSqr<< ‘ ‘ ;
- value ++;
- curSqr = value * value ;
- >
Задача B. Минимальный делитель
Дано целое число, не меньшее 2. Выведите его наименьший натуральный делитель, отличный от 1.
- int n;
- cin >> n;
- int i = 2, min_den = 1;
- int sqrt_n = sqrt(( double )n);
- while (i <= sqrt_n)
- <
- if (n % i == 0)
- <
- min_den = i;
- break ;
- >
- i++;
- >
- if (min_den == 1)
- cout << n;
- else
- cout << min_den;
Задача C. Список степеней двойки
По данному числу N распечатайте все целые степени двойки, не превосходящие N, в порядке возрастания. Операцией возведения в степень пользоваться нельзя!
- int n;
- cin >> n;
- int pow2 = 1;
- while (pow2 <= n)
- <
- cout << pow2 << ‘ ‘ ;
- pow2 *=2;
- >
Той же самой цели можно добиться, заменив явное умножение на 2 побитовым сдвигом.
Вариант 2.
- int n;
- cin >> n;
- int pow2 = 1;
- while (pow2 <= n)
- <
- cout << pow2 << ‘ ‘ ;
- pow2 <<= 1;
- >
Задача D. Точная степень двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае. Операцией возведения в степень пользоваться нельзя!
- int n;
- cin>>n;
- int bitAmount = 0;
- while (n) <
- bitAmount += n % 2;
- n /= 2;
- >
- if (bitAmount == 1)
- cout<< «YES» ;
- else
- cout<< «NO» ;
Задача E. Двоичный логарифм
По данному натуральному числу N выведите такое наименьшее целое число k, что 2 k ≥N.
Операцией возведения в степень пользоваться нельзя!
- int n;
- cin >> n;
- int pow2 = 1, k = 0;
- while (pow2 < n)
- <
- pow2 <<=1;
- k++;
- >
- cout << k;
Задача F. Утренняя пробежка
В первый день спортсмен пробежал x километров, а затем он каждый день увеличивал пробег на 10% от предыдущего значения. По данному числу y определите номер дня, на который пробег спортсмена составит не менее y километров.
Программа получает на вход действительные числа x и y и должна вывести одно натуральное число.
- double x, y;
- cin >> x >> y;
- int k = 1;
- while (x < y)
- <
- x *= 1.1;
- k++;
- >
- cout << k;
Задача G. Банковские проценты
Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть копеек отбрасывается. Каждый год сумма вклада становится больше. Определите, через сколько лет вклад составит не менее y рублей.
Программа получает на вход три натуральных числа: x, p, y и должна вывести одно целое число.
- double x,p,y;
- int years = 0;
- cin>>x>>p>>y;
- while (x<y) <
- x *= (1 + p/100.0);
- x *= 100;
- x = ( int ) x;
- x /= 100;
- years++;
- >
- cout<<years;
- int n, i = 2, f1 = 0, f2 = 1, cur;
- cin >> n;
- while (i <= n)
- <
- cur = f1 + f2;
- f1 = f2;
- f2 = cur;
- i++;
- >
- if (n<=1)
- cout<<n;
- else
- cout << cur;
Задача I. Номер числа Фибоначчи
Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn=A. Если А не является числом Фибоначчи, выведите число -1.
- int a, i = 1, f1 = 0, f2 = 1, cur = 1;
- cin >> a;
- while (cur < a)
- <
- cur = f1 + f2;
- f1 = f2;
- f2 = cur;
- i++;
- >
- if (cur == a)
- cout << i;
- else
- cout << -1;
Задача J. Исполнитель Раздвоитель
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка.
Дано два натуральных числа A и B (A>B). Напишите алгоритм для Раздвоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2.
- int a, b;
- cin >> a >> b;
- while (a > b)
- <
- if (a % 2 == 0 && a / 2 >= b)
- <
- cout << «:2» << endl;
- a /= 2;
- >
- else
- <
- cout << -1 << endl;
- a—;
- >
- >
Задача K. Исполнитель Водолей
У исполнителя “Водолей” есть два сосуда, первый объемом A литров, второй объемом B литров, а также кран с водой. Водолей может выполнять следующие операции:
Наполнить сосуд A (обозначается >A).
Наполнить сосуд B (обозначается >B).
Вылить воду из сосуда A (обозначается A>).
Вылить воду из сосуда B (обозначается B>).
Перелить воду из сосуда A в сосуд B (обозначается как A>B).
Перелить воду из сосуда B в сосуд A (обозначается как B>A).
Команда переливания из одного сосуда в другой приводят к тому, что либо первый сосуд полностью опустошается, либо второй сосуд полностью наполняется.
Программа получает на вход три натуральных числа A, B, N, не превосходящих 10 4 Вам необходимо вывести алгоритм действий Водолея, который позволяет получить в точности N литров в одном из сосудов, если же такого алгоритма не существует, то программа должна вывести текст Impossible. Количество операций в алгоритме не должно превышать 10 5 . Гарантируется, что если задача имеет решение, то есть решение, которое содержит не более, чем 10 5 операций.