A*Z - B = 0 , где

advertisement
CБОРНИК ОЛИМПИАДНЫХ ЗАДАЧ ПО
ПРОГРАММИРОВАНИЮ С РЕШЕНИЯМИ И
ПОЯСНЕНИЯМИ.
2002
-1-
ББК 32.973я973
Ш 38
УДК 681.3(076)
Автор:
Шедько В.В.
CБОРНИК
ОЛИМПИАДНЫХ ЗАДАЧ ПО
ПРОГРАММИРОВАНИЮ
С
РЕШЕНИЯМИ И ПОЯСНЕНИЯМИ: Практический материал в помощь учителям,
студентам, школьникам . – -2002
Рецензенты:
96 с.
А. Б. Кондратович, начальник отдела Учреждения образования “Витебский
областной государственный ИПК и ПРР и СО”,
В брошюре представлен практический материал из опыта работы
Шедько Василия Викторовича по обучению программированию, подготовке и
проведению олимпиад различного от школьного до республиканского уровня.
Сборник, в основном, состоит из авторских задач, их решений на PASCAL
методических рекомендаций к ним. Материал адресуется учителям, работникам
внешкольных учреждений, студентам, школьникам 8-11 классов, всем кто
увлекается и интересуется программированием.
ISBN
(C) Шедько В. В.
Содержание
-2-
Содержание ………………………………………………………………1
Предисловие ……………………………………………………….…….2
Глава 1. Задачи…………………………………………………………..3
Глава 2. «Сюжет знаком, но новые оттенки»……… ………………27
Глава 3. Алгоритмы
решения
задач и методические рекомендации к их
решению………………………… ………………39
Глава 4. Листинги решений на PASCALе ………………………….55
Предисловие
В этой
книге собраны задачи по программированию различного уровня
сложности, но их объединяет то, что все они олимпиадные, как по форме, так и по
содержанию. Олимпиадная форма заключается в том, что условия задач даны в
приведенном к олимпиадному виде: заданы входные и выходные данные и их форматы,
-3-
указаны ограничения на них, сделаны разъяснения и уточнения. Не заданы только
ограничения по времени, за которое программа должна выдать результат, но это время
сильно зависит от технических характеристик компьтера, поэтому, читатель сам сможет его
определить, мне же хочется рекомендовать, чтобы выбираемое ограничение времени было
“разумным “ ( в пределах от нескольких секунд до 1-2 минут, не более ). Олимпиадность
содержания задач состоит в том, что большинство из них имеют несколько различных
решений, и задача состоит не только найти одно из них, а найти хоршее ( быстрое,
рациональное, экономичное или просто оригинальное или красивое ) решение. Для решения
каждой задачи Вам потребуется сначала придумать алгоритм её решения, а затем
реализовать его на языке программирования, затем, преобразовать его для решения задач из
главы 2 и, наконец, сравнить его с авторским алгоритмом (глава 3) и авторским решением
(глава 4). Не все авторские алгоритмы и решения являются оптимальными и наилучшими,
в некоторых случаях это сделано специально, чтобы не лишать тебя, уважаемый читатель,
удовольствия и возможности улучшить, доработать, усовершенствовать авторское решение
или алгоритм. В некоторых случаях, автор мог просто не найти, не увидеть красивого,
хорошего решения и дал то которое нашел, а некоторые из оптимальных решений
являются слишком сложными для реализации или понимания, и в этих случаях автор
приводил не их, а более понятные, доступные и простые.
Все задачи из сборника прошли испытания на олимпиадах школьников различного
уровня (от школьной до республиканской). С течением времени, с ростом технических
возможностей вычислительной техники, некоторые из них могут потерять актуальность или
просто устареть, но в большинстве из них главным останется не техника на которой они
решаются, а алгоритм решения, поиск которого является творческим, интеллектуальным
процессом, который устареть не может.
Дорогой читатель, твори и дерзай, успехов тебе
на не легкой
ниве
программирования и алгоритмизации!
Автор.
-4-
Решать, решать и еще раз решать…..
(Шутка).
Глава 1. Задачи
Задача 1 «Расшифровка»
Задан исходный текст, который зашифрован заменой русских букв путем их
циклического сдвига в алфавите на равное порядковому номеру зашифровываемой буквы в
алфавите число позиций по кольцевому принципу (например: А меняется на Б (на 1 позицию),
Б на Г (2 позиции), Я на Я(33 позиции)). Написать программу, расшифровывающую исходный
текст.
Ввод: Строка – исходный, зашифрованный текст из русских букв.
Вывод: Строка – расшифрованный текст.
Пример:
Ввод:
Вывод:
Гбгб Яжб
Баба Яга
Задача 2 «Арифметика автомобильных номеров»
Автомобильный номер состоит из четырех цифр и двух латинских букв. Поставив
между цифрами и буквами знак равно, будем рассматривать пару букв как число в римской
системе нумерации, а между парами цифр разрешим ставить знаки математических
действий: плюс, минус, умножить (ПРИМЕР:
00 +02). Знак между цифрами ставить не
обязательно. Составить алгоритм, выводящий максимальное количество возможных различных,
верных равенств, для введенной буквенной серии номеров.
Краткие правила римской нумерации: Числа от 1 до 10 : 1 - I; 6 - VI; 2 - II; 7 - VII; 3 - III; 8 VIII; 4 - IV; 9 - IX; 5 - V; 10 - X. Десятки записываются по тем же правилам, только вместо I
используется Х, вместо V используется L - 50, вместо Х используется : С - 100. Для записи сотен
используются символы C, D - 500 и М - 1000 соответственно. Меньшая цифра стоящая слева от
большей этого же разряда вычитается, а справа – прибавляется, число вычисляется как
сумма разрядов. Вычитать разрешено не более одной младшей для данного разряда цифры. В
случае ввода серии из букв, которым не соответствует корректного римского числа выдать
результат «0».
Ввод: Строка из двух больших латинских букв.
Вывод: максимальное число возможных различных, верных равенств соответствующее введенной буквенной серии
номеров.
Пример :
Ввод:
Вывод:
CM
14
Задача 3 «Разрезание листа»
Прямоугольный лист бумаги складывают N раз пополам, сгибая параллельно сначала
одной, а затем другой из взаимно перпендикулярных сторон, (т.е. пополам, получившуюся
фигуру еще пополам и т.д.), а затем разрезают получившуюся в результате складывания
фигуру по диагонали. Составить алгоритм, выводящий максимальное количество частей, на
которое может распасться сложенный и разрезанный таким образом лист, если N –
натуральное число не превосходящее 32.
Ввод : N – число складываний листа.
Вывод: максимальное число частей, на которое может распасться сложенный лист после разрезания.
Пример :
Ввод:
5
Вывод:
23
Задача 4 «КВН»
В КВН участвовали три команды: “BIM”, “BOM” и “BUM”. В перечисленном порядке
вводится количество баллов, набранное командами. Написать программу, которая выдавала
-5-
название команды (или команд), которые заняли второе место в КВН, а при отсутствии
таковых выдавала сообщение “NO”.
Ввод:
B1 B2 B3 - разделенные пробелами количества баллов набранных командами BIM, BOM, BUM –
соответственно.
Вывод: название команды (команд), занявших 2-е место, или сообщение “NO”.
Пример :
Ввод:
Вывод:
10 12.5 16
BOM
Задача 5 «Поезд»
Последовательно вводятся количества пассажиров, которые едут в каждом из N
одинаковых вагонов поезда. Написать программу, которая выдавала бы номера вагонов, в
которых наибольшее количество свободных мест. Ввод корректен.
Ввод: N K – количество вагонов и количество мест в вагоне,
Х1 Х2 X3 Х4 Х5 Х6 Х7 - разделенные пробелами количества пассажиров в вагонах.
Вывод: разделенные пробелами номера вагонов с наибольшим количеством свободных мест.
Пример :
Ввод:
Вывод:
55 33 44 55 77 32 55
6
Задача 6 «Спортсмен»
В этом месяце спортсмен пробегает на каждой тренировке дистанцию в М км..
Известно, что каждый месяц длина дистанции возрастает на Р %. Написать программу,
которая вычисляет, сколько месяцев назад длина пробегаемой за тренировку дистанции
составляла Y км., если входные данные не корректны - вывести сообщение “NO”.
Ввод: М Y Р - длины дистанций сейчас и некоторое время назад и процент их увеличения.
Вывод: число - сколько месяцев назад дистанция была Y км. или сообщение - NO
Пример :
Ввод:
Вывод:
4.630400 4.000000 5.000000
3
Задача 7 «Вычитание дробей»
Заданы
две
правильные
(числитель
меньше
знаменателя),
несократимые
арифметические дроби. Написать программу, которая вычисляла бы разность между
большей и меньшей из дробей и выдавала ответ в виде правильной, несократимой
арифметической дроби. Числители и знаменатели дробей - натуральные числа не
превышающие 46340. Ввод корректен.
Ввод:
С1 Z1 С2 Z2 - разделенные пробелами числители и знаменатели первой и второй дробей
соответственно.
Вывод: С и Z - разделенные пробелом числитель и знаменатель дроби-результата.
Пример :
Ввод:
5 24 3 16
Вывод:
1 48
Задача 8 «Разные отрезки»
Отрезок на плоскости задан координатами его концов. Написать программу, которая
вычисляла бы количество различных отрезков, целиком лежащих на данном отрезке, обе
координаты концов, которых - целочисленные. Концы принадлежат отрезкам.
Ввод:Х1 Y1 X2 Y2 - разделенные пробелами координаты концов отрезка.
Вывод: число - результат.
Пример :
Ввод:
Вывод:
0.5 0.5 -3.3 -3.3
6
Задача 9 «Шифр»
Заданы три натуральных числа: два исходных числа и номер члена, который является
ключом к шифру. Каждый последующий член последовательности получается путем
-6-
прибавления к сумме двух предыдущих членов, суммы цифр суммы двух предыдущих
членов. Написать программу, которая определяла бы ключ к шифру. Исходные данные натуральные числа до 1000. Ввод корректен.
Ввод: С1 С2 N - разделенные пробелом исходные числa и номер искомого члена.
Вывод: число-результат.
Пример :
Ввод:
Вывод:
39 11 5
140
Задача 10 «Ход конем»
На клетчатой доске размером N*N клеток в клетке с координатами А, В (координаты
отсчитывать от левого нижнего угла), стоит шахматный конь. Конь за один ход
перемещается одновременно на две клетки вперед и одну в сторону в любом горизонтальном
или вертикальном направлении в пределах заданной доски. Написать программу, которая
вычисляла бы количество клеток, в которые конь не сможет попасть за М и менее М ходов.
Ввод корректен, М и N: 1<N<101, 0<=M<1001.
Ввод: N A B М - : размер доски, координаты коня и количество ходов.
Вывод: число - результат.
Пример:
Ввод:
Вывод:
5 1 1 3
3
Задача 11 «Ближайшее число»
Для заданного числа M ( 0<М<2 000 000 000 ), заменой в нем одной любой цифры, найти
ближайшее, отличное от М число, которое нацело делилось бы на количество различных знаков,
необходимых для записи искомого числа в N-ричной системе счисления (1<N<100). Заданное и
искомое числа представляются в десятичной системе счисления. При наличии двух решений взять меньшее из них, при отсутствии решения - выдать: ‘NO’. Пример, M=17, N=2; решения два:
16 (в двоичной системе 10000 для его записи нужны два знака {0,1}; 16 делится на 2 без
остатка ), второе решение- 18 (в двоичной системе 10010 для его записи нужны два знака
{0,1}; 18 делится на 2 без остатка), выбираем меньшее из них в качестве ответа : 16 .
Ввод: М N - разделенные пробелами: число и основание системы счисления.
Вывод: число - результат.
Пример:
Ввод:
Вывод:
90372 13
90370
Задача 12 «Паралеллопландия»
Страна Параллелопландия имеет форму прямоугольного параллелепипеда размера А на В
на С, состоящего из кубиков с единичной длиной ребра. Гражданами этой страны являются
все прямоугольные параллелепипеды, расположенные в пределах ее границ и состоящие из
целого числа
единичных
кубиков. Родственниками
в этой стране
считаются те
параллелепипеды, которые имеют хотя бы один общий единичный
кубик. Еще в
Параллелопландии есть общество кубов, членами которого являются граждане, имеющие все
три одинаковых размера. Необходимо
написать программу, которая поможет одному
маленькому кубику, расположенному по адресу А1, В1, С1 ( число А1 - это номер ряда, в
размере А страны, в котором расположен этот единичный кубик, аналогично числа В1 и С1),
подсчитать сколько в Параллелопландии граждан не являющихся членами общества кубов не
являются родственниками маленького куба. А,В,С,А1,В1,С1 - натуральные числа не
превосходящие 50..
Ввод: А В С - разделенные пробелами - размеры страны, в первой строке и –
А1 В1 С1 - три числа, разделенные пробелами - адрес кубика - вo второй строке.
Вывод: число - результат.
Пример:
Ввод:
Вывод:
2 1 2
2
1 1 2
-7-
Задача 13 «Число ходов»
На клетчатой доске размером N на N клеток расставлено K белых коней и один
черный конь. Один ход коня: на две клетки вперед и на одну в сторону в любом
направлении в пределах доски (как в шахматах ). Клетка находится под боем коня, если
он может стать в нее за один (следующий) ход. Составить программу, подсчитывающую за
какое наименьшее число ходов черный конь, может пройти в клетку с заданными
координатами X, Y , не становясь по пути в клетки, находящиеся под боем белых коней,
и в клетки, в которых стоят белые кони. Белые кони стоят неподвижно. Если пройти
невозможно вывести сообщение: NO. Координаты - натуральные числа, отсчитываются от
левого
нижнего угла доски: первая координата - номер вертикали, вторая - номер
горизонтали, в которой находится клетка. Ввод корректен. Начальное положение черного
коня может быть под боем белого коня, если конечная точка под боем - то пройти
невозможно.
2 < N < 100, K<=N .
Ввод: из К+1 строки: в 1-й строке: N- размер доски, Х1, У1 -начальные координаты черного коня, Х, У координаты конечной точки, К - количество белых коней, в каждой из следующих К строк: Хi, Yi- координаты i-го
белого коня..
Вывод: число - результат или сообщение - NO.
Пример:
Ввод:
Вывод:
1 3 3 1 2
4
2 2
3 2
Задача 14 «Хакер»
Хакеру при помощи подслушивающего устройства удалось подслушать пароль доступа к
секретной
компьютерной
базе данных, который был
продиктован
по телефону
посимвольно ( в звуковой форме наименование букв и цифр, например: буква М
произносилась как 'эм', а записывалась хакером в виде одного символа ). Хакер записал
пароль в виде строки, состоящей из заглавных букв и цифр. Но радость хакера была
преждевременной, так как по телефону ни слова не было сказано большие или маленькие,
русские или латинские буквы используются в пароле, а система защиты базы данных
различает буквы по этим признакам, кроме этого, записывая буквы, в спешке, хакер
записывал услышанные знаки, не учитывая, что
некоторые
из
них в различных
алфавитах пишутся одинаково, но звучат по-разному ( например: Р "эр"(рус.) и "пэ" (лат.)).
Составить программу, подсчитывающую за какое число попыток ввода пароля, хакеру
гарантированно удастся проникнуть в интересующую его базу данных. Ввод корректен. В
пароле могут использоваться латинские и русские буквы и цифры, других символов в пароле нет.
Длина пароля не превышает 80 символов. Уточнение: одинаково произносиосимыми
в
различных алфавитах считать буквы:
русские - АБВД ЕЖИКЛМНОПРСТУФЦ
латинские - ABVDE G I KLMNO PRSTU FC
одинаковыми по написанию в различных алфавитах считать буквы:
русские - АВЕКМНОРСТХ
латинские - ABEKMHOPCTX.
Ввод:. строка-пароль, записанная цифрами и заглавными буквами.
Вывод: число - результат.
Пример:
Ввод:
Вывод:
AB12
32
Задача 15 «Разноделящиеся числа»
Будем называть два целых числа «разноделящимися», если большее по модулю делится
без остатка на меньшее по модулю и нет ни одной такой цифры, которая входила бы в
десятичную запись обоих этих чисел. Меньшее по модулю из этих чисел будем называть
-8-
«разноделящимся» делителем большего по модулю числа. Составить программу находящую на
заданном интервале число (максимальное) имеющее наибольшее количество различных
«разноделящихся»
делителей. Вывести
это
число и количество
его
различных
«разноделящихся» делителей. В отдельно взятом одном из «разноделящихся» чисел цифры
могут повторяться; А и В - границы интервала числа, не превосходящие по модулю число 2
000 000; границы входят в интервал, задаются и вводятся в произвольном порядке; длина
интервала не превосходит 202; если на заданном интервале несколько чисел имеют равное
наибольшее количество
различных «разноделящихся» делителей, то взять максимальное
из них; число «1» считать делителем (обычным) любого числа;
знак числа цифрой не
считать;
Ввод: два числа: А и В - границы интервала.
Вывод: два числа: первое - на заданном интервале число, имеющее наибольшее количество различных
«разноделящихся» делителей, второе - количество различных «разноделящихся» делителей первого числа.
Пример :
Ввод:
9 16
Вывод:
16
6
Задача 16 «Муравейник»
Вначале сезона из переполненного муравейника уходят М муравьев, которые строят свой
новый муравейник, развивающийся по законам:
- количество родившихся за сезон молодых муравьев равно увеличенному в К раз
количеству муравьев в муравейнике, возраст которых на начало сезона не превышал двух
сезонов;
- продолжительность жизни муравья G сезонов;
- когда численность родившихся за сезон муравьев более чем в В раз превысит их
начальное количество, из муравейника уходит 1/В часть муравьев, возраста один сезон
(родившихся в прошлом сезоне), чтобы организовывать свои новые муравейники (уход
происходит в том же сезоне за который подсчитывается число родившихся).
Составить программу находящую количество муравьев в муравейнике через Т сезонов после
его основания. Все события, происходящие в муравейнике, (рождения, смерти, уходы)
происходят в течении сезона, но итоги подводятся только по окончании сезона, и весь
следующий сезон до его окончания действуют цифры прошлого сезона.Возраст родившегося
в текущем сезоне муравья до наступления следующего сезона равен нолю.
Количество уходящих муравьев округляется до целого по правилам арифметики. М,G,К,Т и
В - натуральные числа, 1<М <1000, G,К,Т,В не превосходят 255 ; ввод корректен.
Ввод: числа М,K,G,В,T- в перечисленном порядке.
Вывод:. число муравьев в муравейнике после Т сезонов.
Пример :
Ввод:
Вывод:
2 3 3 2 5
1005
Задача 17 «Составь перевертыш»
Вводится строка до 255 символов. Написать программу составляющую из символов
этой строки наибольшей возможной длины «перевертыш»
(строка одинаково читаемая
справа налево и слева направо), в левой половине которого символы упорядочены по
порядку возрастания их ASCII кодов .
Ввод: строка до 255 символов.
Вывод: 1-я строка: длина «перевертыша»
2-я строка: «переветыш».
Пример :
Ввод:
ИНФОРМАТИКА
Вывод:
5
АИКИА
Задача 18 «Визы»
-9-
Имеется файл из N<=1000 записей, в каждой из которых содержатся дата открытия и
дата закрытия визы в формате: ГГГГ.ММ.ДД где: ГГГГ - год(4-ре цифры), ММ - № месяца
(2 цифры), ДД - число (2 цифры). День открытия и день закрытия визы входят в срок действия
визы. Составить программу, вычисляющую по имеющемуся файлу, какое было максимальное
число открытых одновременно виз. Ввод корректен.
Ввод: 1-я строка: число N - количество записей, далее N - строк: в каждой сначала дата открытия, затем дата
закрытия визы, разделенные одним пробелом.
Вывод: число - результат.
Пример :
Ввод:
Вывод:
4
3
2000.01.01 2000.05.11
1997.11.30 1999.12.31
1998.06.07 2000.10.20
1999.01.01 2000.01.01
Задача 19 «Цветная игра»
Два художника играют на клетчатом поле размером А на В клеток в «цветную» игру
по правилам: первый берет палитру из К различных цветов и разукрашивает всеми
возможными способами игровое поле, обязательно закрашивая при этом каждую клетку в
один из цветов (всю клетку в один цвет);второй художник - проводит по игровому полю
диагональ, которая разбивает некоторые клетки поля на две части, ему разрешено
закрашивать получившиеся части клеток каждую часть своим цветом, а клетки не
разделенные диагональю он красит по тем же правилам что и первый художник; Составить
программу вычисляющую для второго игрока какое минимальное число цветов должен взять
он, чтобы число различных способов раскраски его игрового поля было не меньше числа
способов раскраски игрового поля первого игрока К цветами. Цвета смешивать и получать
новые нельзя; игровое поле поворачивыть нельзя (способы раскраски полученные
поворотами поля считать различными); А,В,К - натуральные числа, К не превосходит 50000,
А и В не превосходят 2000000; ввод корректен.
Ввод: 1-строка: три числа А и В – размеры поля, К –количество цветов у первого игрока.
Вывод: число - результат.
Пример :
Ввод:
Вывод:
3 2 3
2
Задача 20 «Белка»
Имеется парк из N<=100 деревьев, расстояния между которыми содержатся в
симметричной прямоугольной таблице размером N*N (элемент таблицы в А-м столбце и В-й
строке означает расстояние между деревьями с номерами А и В). Белка может сделать
прыжок длиной до Р (включая Р). Составить программу, вычисляющую, за какое
минимальное число прыжков белка сможет попасть с дерева с номером М на дерево с
номером Z , не спускаясь на землю, а прыгая с дерева на дерево. Если белка сделать это,
не спускаясь на землю, не сможет, выдать сообщение ‘NO’. Ввод корректен.
Ввод: 1-я строка: числа N - количество деревьев, Р - длина прыжка белки, М – номер дерева с которого и Z –
номер дерева на которое прыгает белка, далее N – строк таблицы расстояний между деревьями ..
Вывод: число - результат.
Пример :
Ввод:
Вывод:
2
2
1 2
1
0
1.5
1.5 0
Задача 21 «Неравенство»
Составить программу находящую
наибольшее
Х! <= В
Х! означает 1*2*3*4* ……*(Х-1)*Х;
- 10 -
натуральное
решение
неравенства:
Х и В - натуральные числа, длина В не превосходит 255 цифр; ввод корректен.
Ввод: число В .
Вывод: число - результат.
Пример :
Ввод:
40322
Вывод:
8
Задача 22 «Cтадион»
Будем называть «счастливым» билет, с номером состоящим из N цифр, если сумма первой
половины цифр (включая среднюю цифру для нечетных N) равна сумме второй половины
цифр (включая среднюю цифру для нечетных N).Стадион вмещает на один матч Z зрителей.
Билеты номеруются начиная с номера 1, все недостающие до N разряды заполняются «0»
(пример: для N=5 билет с номером 13 записывается 00013). Составить программу, находящую
максимальное количество зрителей на одном матче, имеющих «счастливые» билеты. N и Z натуральные числа, N не превосходит 7, Z не более 100 000 ; билеты продаются в порядке
следования номеров; стадион на матче не обязательно заполняется полностью; продажа
билетов на следующий матч продолжается с номера следующего за последним номером
проданного на предыдущий матч билета; если номера заканчиваются, то продавать начинают
новую серию билетов, начинающуюся с номера 1 (только с другими буквами, которые нас
не интересуют) ;пока не проданы все билеты начатой серии билеты из новой серии не
продают.
Ввод: два числа: N – количество цифр в номере билета и Z – вместимость стадиона.
Вывод: максимальное число болельщиков на матче со «счастливыми» билетами.
Пример :
Ввод:
2 100
Вывод:
10
Задача 23 «Эстафета фишек»
На клетчатом поле размером N*N клеток расставляют М разноцветных фишек: белые
фишки ставят в клетки, у которых обе координаты – нечетные числа, черные фишки ставят в
клетки, у которых обе координаты – четные числа, в клетки, у которых одна координата
(любая) нечетная, а вторая – четная ставят фишки красного цвета. Фишки могут ходить
вправо-влево вверх- вниз на одну клетку за один ход.Составить программу вычисляющую для
каждого цвета фишек за какое минимальное число ходов фишки этого цвета смогут
собраться все в одной клетке. Цвет фишек определяется координатами их начальной
расстановки и больше не изменяется; координаты отсчитываются от верхнего левого угла,
первая координата – номер строки, вторая - номер столбца; в начальной расстановке и в
процессе игры в одной клетке могут находиться одновременно несколько фишек; N и М натуральные числа, N не превосходит 255, М не превосходят 2000; ввод корректен.
Ввод: 1-строка: два числа N– размер поля, М – количество расставляемых фишек. В каждой из следующих М
строк - координаты расставляемых фишек.
Вывод: 1-я строка: минимальное число ходов для белых фишек, 2-я строка: минимальное число ходов для черных
фишек, 3-я строка: минимальное число ходов для красных фишек
Пример :
Ввод:
Вывод:
5
1
1
4
5
5
1
2
7
1
2
2
5
1
5
2
16
2
0
Задача 24 «Морковка»
- 11 -
На грядках рядами, по N штук в каждом, растет морковка. Грядки на участках, участки
в секторах, а сектора - на полях расположены так же рядами по длине и ширине в виде
прямоугольников. Кролик записал на отдельных листочках координаты (номера рядов по длине
и ширине для участка в секторе, сектора на поле, для грядки на участке, для морковки на грядке всего восемь координат), где растет самая большая морковка, но забыл записать на каком
листочке какая координата записана. Написать программу, вычисляющую какое наименьшее
число морковок нужно будет вытащить Винни-Пуху и его друзьям, имея восемь листочков с
номерами, но не зная какой номер к чему относится, чтобы среди вытянутых морковок точно
оказалась самая большая морковка. Ввод корректен. (Кролик не станет записывать ерунды, когда
дело касается большой морковки).
Ввод: восемь целых чисел – номеров.
Вывод: число - результат.
Пример :
Ввод:
1 1 2 1 1 1 1 1
Вывод:
8
Задача 25 «Конденсаторная батарея»
В галактической системе UYUY37UY на планету UU-2765 совершил вынужденную
посадку звездолет «OLIMPIA-2001», у которого вышла из строя конденсаторная батарея,
представляющая собой набор соединенных (параллельно и последовательно) конденсаторов.
Инженеру-механику известна схема соединения и емкости
соединенных в батарею
конденсаторов. Составить программу, находящую значение емкости батареи. Схема соединений
батареи произвольная, но соединение конденсаторов в батареях только параллельное или
последовательное (т.е. соединений типа “треугольник” или “звезда” нет), при параллельном
соединении конденсаторов их общая емкость равна сумме соединенных емкостей, при
последовательном соединении – общая емкость вычисляется по формуле:
Cобщ= С1*С2/ (С1+С2),
емкость конденсатора - положительное
число
не
превосходящее 2500,
количество
конденсаторов в батарее - натуральное число не превосходящее 50, емкость батареи
измеряется между спайкми с максимальным номером и номером 1.
Ввод: первая строка: два натуральных числа N (число конденсаторов в старой батарее) и М (количество спаек
конденсаторов), в каждой из следующих N строк по три числа - .сведения об конденсаторе: А и В - номера
спаек к которым присоединен конденсатор, С - его емкость .
Вывод:. одно число - округленное до трех знаков после запятой значение емкости конденсаторной батареи.
Пример :
Ввод:
5 4
1 2 400
1 3 200
2 3 400
3 4 240
3 4 360
Вывод:
240.000
Задача 26 «Номера соседних кубиков»
Куб с целочисленной длиной ребра разделен на кубики с ребрами единичной длины ,
которые пронумерованы числами от 1 до N^3 по следующим правилам : 1. В каждом
горизонтальном слое кубиков нумерация ведется по спирали, начиная от одного и того же
ребра большого куба и в одном и том же направлении для всеx горизонтальныx слоев;
2.
Нумерация начинается в одном из углов куба и последовательно продолжается от слоя к слою.
Составить алгоритм, который по заданной длине ребра и номеру кубика выдавал бы номера
кубиков, имеющиx с заданным кубиком общую грань. Пример нумерации для куба с длиной
ребра 3:
1-й слой
2-й слой
3-й слой
1 2 3
10 11 12
19 20 21
8 9 4
17 18 13
26 27 22
7 6 5
16 15 14
25 24 23
- 12 -
Ввод: L N - длина ребра и номер кубика
Вывод:. номера кубиков, имеющих общую грань с заданным кубиком.
Пример :
Ввод:
Вывод:
3 1
2 8 10
Задача 27 «Таблица»
В двумерной таблице размером N на N элементов встречается ровно N различных чисел,
причем в любой строке все элементы различные. Подсчитать, на сколько нолей заканчивается
число возможных различных значений этой таблицы.
Ввод корректен. 0 < N < 1 000 000
000 .
Ввод: число – N.
Вывод: число-результат - на сколько нолей заканчивается число возможных различных значений таблицы, число
представляется в виде последовательности цифр в десятичной записи (другие формы представления числа недопустимы).
Пример :
Ввод:
Вывод:
6
6
Задача 28 «АВХ»
Натуральное число N представить в виде суммы двух целых чисел А и В, возведенных
в максимально возможную, одинаковую для А и В, целую степень Х.
2< N <1000000.
Ввод: число N.
Вывод: числа. А В Х.
Пример :
Ввод:
1125
Вывод:
10 5 3
Задача 29 «Ломаная»
Ломаная задана координатами вершин в порядке их соединения. Составить программу,
подсчитывающую количество общих точек у ломаной с осями координат. Сначала вводится N число вершин ломаной, а затем, N раз (Хi , Yi) - координаты вершин в порядке их соединения в
ломаной; при бесконечном количестве общих точек, в качестве решения вывести три
восклицательных знака, без пробелов между ними.
Ввод:
Вывод: число-результат.
Пример :
Ввод:
4
1.5 2.5
-1 -1
8.1 -2.3
4.7 -5.3
Вывод:
3
Задача 30 «Подарки»
На елке висят новогодние подарки: шары, конфеты, хлопушки. Каждый из гостей может
взять себе в качестве подарка два любых предмета, при этом на елке вместо двух снятых
появляется один предмет, если были взяты одинаковые предметы, то появляется - конфета, если
- разные, то появляется предмет которого не было среди взятых (например: если взяли хлопушку
и конфету, то появится - шар ), определить, какой из предметов может остаться последним, если
вначале на елке было N шаров, K конфет, M хлопушек, если остается шар вывести - 1, если
конфета - 2, хлопушка вывести - 3.
Ввод: N, K, M – число шаров, конфет хлопушек.
Вывод: число-результат.
Пример:
Ввод:
2 3 1
Вывод:
1
- 13 -
Задача 31 «Разложение на одинаковые множители»
Заданное целое число не превосходящее по абсолютной величине число 2100000000
представить в виде произведения максимального числа одинаковых целых множителей.
Ввод: исходное число
Вывод: сначала количество, а затем значение множителя.
Пример :
Ввод:
Вывод:
1024
10 2
Задача 32 «Взвешивания»
Определить, можно ли на чашечных весах взвесить груз весом G при помощи набора из
N гирь масами М1,М2,...МN. Числа G,N,Mi -целые ;ответ выдать в форме YES - если взвесить
можно, NO - если нельзя.
Ввод: 1-я строка G N - вес груза и количество гирь, 2-я строка через пробелы массы гирь Мi.
Вывод: ответ YES или NO .
Пример :
Ввод:
Вывод:
150 4
YES
100 30 300 20
Задача 33 «Заливка»
В графическом редакторе нарисовали прямоугольник, разделенный на одинаковые
малые прямоугольники размера C на D единиц каждый, затем цветом отличным от цвета границ
прямоугольников провели обе диагонали в большом прямоугольнике, размеры которого A на B
малых прямоугольников, и произвели заливку всех малых прямоугольников, через которые
прошли диагонали, цветом диагоналей (малые прямоугольники, в которых диагонали прошли
только по границе, не заливали). составить программу, которая по введенным размерам
прямоугольников: А, В, С, D , выводила бы величину залитой цветом диагоналей площади.
Ввод корректен.
Ввод: А В С D размеры прямоугольников.
Вывод: число-результат.
Пример :
Ввод:
2 6 3 1
Вывод:
36
Задача 34 «Дважды счастливые номера»
Автомобильный номер состоит из четырех цифр и двух больших латинских букв .
"Дважды счастливыми" номерами будем называть номера у которых: сумма двух первых равна
сумме двух оставшихся цифр номера и сумма цифр порядковых номеров букв в алфавите равна
сумме цифр номера автомашины . (Например : номер 0312 BD - "дважды счастливый" т.к.
0+3=1+2 и 0+3+1+2=0+2+0+4, /буква В в алфавите 2-я,а D - 4-я/.) Составить программу, которая
по введенной одной из букв номера автомашины, выводит вторую букву, такую, что различных
возможных "дважды счастливых" номеров с этими двумя буквами будет наибольшее
количество. Ввод корректен.
Ввод: большая латинская буква.
Вывод: буква-результат.
Пример :
Ввод:
F
Вывод:
S
Задача 35 «Купцы»
N купцов перевозят на судне товар по Х ящиков у каждого , ящики выставлены на
палубе в произвольном порядке. Судно повреждено, чтобы его спасти необходимо выбросить
за борт U - ящиков . Выбрасывать решили по жребию : начиная с любого ящика , считая по
кругу , по часовой стрелке , выбрасывается каждый К-й ящик . Написать алгоритм , выдающий
- 14 -
наименьший номер с которого купцу необходимо начинать счет , чтобы
число ящиков
этого купца , выброшенных за борт было минимальным. Вывести номер ящика, с которого
начинать счет, и число выброшенных при этом ящиков купца.
Ввод: 1-я строка N X U K F - сколько купцов, по сколько ящиков у купца, сколько ящиков выбрасывать,
какой по счeту выбрасывать, для какого купца. 2-я строка – начальная расстановка
Вывод: номер ящика, с которого начинать счет, и число выброшенных при этом ящиков.
Пример :
Ввод:
Вывод:
3 3 4 5 2
3 0
3 2 1 1 2 3 1 2 3
Задача 36 «Выпавшие страницы»
Из книги, в которой не более 2000 страниц, выпали страницы, таким образом, что
номер первой и последней выпавших страниц состоят из одних и тех же цифр. Составить
программу, вычисляющую максимальное количество страниц, которое могло выпасть из
книги, для введенного номера первой выпавшей страницы.
Ввод: номер первой выпавшей страницы.
Вывод: число-результат.
Пример :
Ввод:
125
Вывод:
388
Задача 37 «Двоичное уравнение»
Составить программу, решающую уравнение А*Х+В=С, в котором А,В,С и Х - числа,
заданные в двоичной системе счисления. Ввод коректен.
Ввод: Три строки: три числа А В С , длиной до 30 знаков.
Вывод: Единственное число - Х – решение уравнения в двоичной системе счисления, округленное до двух
знаков после запятой.
Пример :
Ввод:
Вывод:
111
101.00
10001
110100
Задача 38 «Треугольники»
Треугольники, заданные длинами сторон в виде троек чисел, располагают так, что одна из
сторон лежит на одной общей для всех треугольников прямой. Составить программу,
вычисляющую: какое максимальное число параллельных сторон, не лежащих на общей
прямой может получиться для заданного набора из N треугольников. Ввод коректен.
Ввод:1-я строка: N (1<=N<=255) - количество треугольников, далее N строк в каждой из которых по три числа
А В С - длины сторон k-го треугольника.
Вывод:
Единственное число - M – решение задачи.
Пример :
Ввод:
Вывод:
3
2
3
4
5
0.5 1.3 1.2
8
8
6
Задача 39 «Строки»
Вводятся две строки. Составить программу, отвечающую: 1) можно ли получить
вторую строку выбрасыванием символов из
первой строки читаемой обычно (слева
направо). 2) можно ли получить вторую строку выбрасыванием символов из первой строки
читаемой справа налево. Ответы выдать словами: YES - если можно получить и NO - если
нельзя, Слова YES и NO должны быть выведены большими латинскими буквами.
Ввод:1-я строка: из которой выбрасыванием символов, получают вторую. 2-я строка: та которую нужно
получить.
- 15 -
Вывод: YES - если можно получить из 1-й строки 2-ю и NO - если нельзя, 1-я слово: можно ли получить
строку 2 выбрасыванием символов из 1-й строки читаемой обычно, а 2-е слово: то же, но для 1-й строки,
читаемой наобарот.
Пример:
Ввод:
Вывод:
ИНФОРМАТИКА
YES
НОРМА
NO
Задача 40 «Состав сплава»
В сплаве из N элементов содержится по Xi % i-го компонента. Цена сплава S у.е. за 1
кг. Добавляя новый (N+1) компонент, ценой Z у.е. за 1 кг., получают новый сплав,
состоящий из N+1 элемента и ценой F у.е. за 1 кг. Вывести процентный состав нового
сплава.
Ввод:1-я строка: N (1<=N<=25) - количество элементов в сплаве. 2-я строка: Х1 Х2 Х3 … ХN - % состав
старого сплава. 3-я строка : S F Z - три цены: старого, нового сплавов и добавляемого элемента
(соответственно).
Вывод:К1 К2 К3 …. КN KN+1 -% состав нового сплава (в формате с двумя знаками после запятой).
Пример :
Ввод:
Вывод:
4
10.00 15.00 5.28 19.72 50.00
20.00 30.00 10.56 39.44
8.10
9.00
9.90
Задача 41 «Магический квадрат»
Магическим квадратом называется такое расположение чисел в виде квадратной
таблицы, когда все суммы по строкам, столбцам и большим диагоналям равны между
собой. Размерностью квадрата будем называть количество чисел в строках (столбцах)
таблицы. В этой задаче Вам нужно составить максимальной размерности магический
квадрат из набора различных чисел от 1 до М*М (М-размерность квадрата, каждое число
используется в квадрате один раз). Составленный магический квадрат записать в выходной
файл, который сдается в качестве результата работы. Тексты программ сдавать не надо.
Баллы за задачу будут начисляться в зависимости от величины и четности – нечетности (четным
даются дополнительные баллы) размерности полученного ВАМИ магического квадрата.
Вывод (Файл: *.TXT): 1-я строка: число М размерность квадрата, далее
(разделенные пробелом числа, из которых состоит строка квадрата).
- М строк: строки квадрата
Задача 42 «Времена»
Вводятся два целых числа: первое - время в часах (от 0 до 24), второе - номер
месяца (от 1 до 12).Написать программу, выдающую сообщение о соответствующих
введенным числам времени суток и поре года. Время суток и пору года выводить
большими латинскими буквами на английском языке: Весна (3-5 месяцы)- SPRING, лето (6-8)
– SUMMER,
осень (9-11) - AUTUMN, зима (1,2,12) - WINTER. Утро ( с 6 до 10 часов) MORNING, день (с 11 до 17 часов) - DAY, вечер (с 18 до 23 часов) - EVENING, ночь (с 0(24)
до 5 часов) – NIGHT; (границы времени суток входят в интервал). Ввод и данные корректны.
Вход: Разделенные пробелом два числа: первое - время в часах, второе - номер месяца.
Выход:Время суток и через пробел пора года, соответствующие введенным числам.
Пример :
Ввод:
Вывод:
24 12
NIGHT WINTER
Задача 43 «Сказка»
Иван Царевич сражается со Змеем Горынычем, у которого N (N<30333) голов, которые
Иван отрубает так: если у змея четное число голов - он отрубает 9 голов, а если нечетное
- 11 голов одним ударом. После каждого удара, если у Змея осталась не срубленной хотя
бы одна голова, то отрастает еще 8 новых голов. Змей побежден, если после очередного
удара мечом у него не осталось ни одной головы. Написать программу, которая
вычисляла бы, какое количество ударов понадобится Ивану Царевичу для победы над Змеем
Горынычем, и сколько при этом он отрубит голов у Змея.
- 16 -
Вход:N - начальное число голов у Змея Горыныча.
Выход: Разделенные пробелом два числа: первое – число ударов, второе - число срубленных при этом голов.
Пример :
Ввод:
Вывод:
33
13 129
Задача 44 «Гномы»
Семь гномов имеют каждый по одной кружке, емкостью от 100 до 1000 грамм
(емкость кружки - вещественное число из указанного диапазона, заданное в формате с
шестью знаками после запятой). Для приготовления своих волшебных смесей гномы
используют живую и мертвую воду, источники которой находятся возле их жилищ. Воду
из источников брать и выливать обратно можно в не ограниченных количествах, но
приготовление
волшебных
смесей
требует
очень
большой
точности (до долей
миллиграммов, или шести знаков после запятой). Написать программу, которая по заданным
семи емкостям кружек, определяла
с
точностью до шести знаков после запятой,
минимальный объем воды, который можно точно отмерить данным набором кружек.
Вход: в строке 7 чисел, разделенных пробелами - емкости кружек.
Выход: Число – решение в формате вида: ####.######.
Пример: Вход:
100.000000 125.125000 250.125000 250.250000 500.000000 750.125000 1000.000000
Выход:
0.125000
Задача 45 «Пятница,13»
Необходимо написать программу, которая по введенным: номеру
дня недели
начальной даты, начальной и конечной датам, вычисляла бы
количества дней между
введенными датами (сами даты включаются в интервал) на которые приходились понедельник
13 числа и пятница 13 числа. Дни номеруются с понедельника (имеет номер 1); Начальная
дата меньше конечной; Даты задаются в формате: ДД/ММ/ГГГГ , где ДД - две цифры число месяца, ММ- две цифры - номер месяца, ГГГГ- четыре цифры – номер года; Данные,
даты и ввод - корректны.
Вход: 1-я строка: находится число N (номер дня недели начальной даты); 2-я строка - начальная дата; 3-я строка –
конечная дата.
Выход: два числа, разделенные пробелом, – первое - количество понедельников 13, второе - количество
пятниц 13, между введенными датами.
Пример :
Ввод:
Вывод:
1
1 2
01/01/2001
31/12/2001
Задача 46 «Вписанный квадрат»
В треугольник с длинами сторон А В С вписали квадрат так, что одна из сторон
квадрата лежит на большей из сторон треугольника, а две оставшиеся вершины квадрата
лежат на других сторонах треугольника. Написать программу, которая вычисляла бы
периметр вписанного квадрата.
Вход:А В С - разделенные пробелами длины сторон треугольника.
Выход:одно число - периметр вписанного квадрата.
Пример:
Ввод:
Вывод:
4.00 2.4 2.4
3.985
Задача 47 «Контрольные суммы»
При зашифровке текста для каждого слова в тексте вычисляется его контрольная
сумма, равная сумме порядковых номеров в алфавите букв из которых состоит слово,
например: для слова ABba контрольная сумма равна (1+2+2+1)= 6. Написать программу,
которая вычисляла бы количество различных отличных от нулевой контрольных сумм,
- 17 -
встречающихся в заданном тексте. В исходном тексте до 25000 слов, слова разделены
одним или несколькими пробелами, длина слова до 80 символов, для большой и малой
букв порядковые номера в алфавите считать одинаковыми, в контрольную сумму слова
считать только номера латинских букв, для других символов номер в алфавите считать
равным нулю.
Вход: Исходный текст.
Выход: число - результат.
Пример:
Ввод:
Good BYE, MY LoVe!
Вывод:
4
Задача 48 «Слово в слове»
Вводятся два слова. Написать программу, выдающую, сколько раз одно из слов
встречается в другом. Слова вводятся большими латинскими буквами, длина слов до 255
букв, любая буква входит не более чем в одно вхождение одного слова в другое(см. пример
теста). Ввод и данные корректны.
Вход: две строки: первая - одно слово, вторая - другое слово.
Выход: Число - количество вхождений одного слова в другое.
Пример:
Ввод:
Вывод:
ABRAKADABRABRABRA
3
ABRA
Задача 49 «Гирлянда»
Новогодняя елочная гирлянда состоит из соединенных последовательно разноцветных
лампочек. Гирлянда состоит из N лампочек (0<N<125) семи различных цветов, которые мы
будем обозначать числами от 1 до 7 соответственно. Вводятся количество лампочек и порядок
следования их цветов в гирлянде. Написать программу, подсчитывающую наибольшее
количество идущих подряд в гирлянде лампочек одного цвета. Ввод и данные корректны.
Вход: две строки: первая - N количество лампочек в гирлянде, вторая - разделенные пробелами N чисел (от 1
до 7) - порядок следования цветов ламп в гирлянде.
Выход: Число - наибольшее количество идущих подряд лампочек одного цвета.
Пример:
Ввод:
Вывод:
17
4
1 3 3 2 4 4 4 7 7 7 5 5 5 5 6 6 5
Задача 50 «Чемпионат»
В чемпионате принимают участие N команд, которые встречаются по одному разу друг
с другом, за победу дается 3 очка, за ничью 1 очко, за поражение 0 очков. Написать
программу, вычисляющую какое наибольшее число
раз мог сыграть вничью в этом
чемпионате «Локомотив», если он набрал Х очков. Ввод корректен, корректность данных
предусмотреть, при некорректности данных вывести NO.
Вход: два числа: первое - число команд в чемпионате, второе - очки, набранные “Локомотивом” в чемпионате.
Выход: Число - максимальное количество ничьих или NO - если данные не корректны.
Пример:
Ввод:
Вывод:
7
12
3
Задача 51 «Новый дом»
Три поросенка Нуф-Нуф, Наф-Наф и Ниф-Ниф имеют каждый по одному дому,
которые не могут гарантировать им надежную защиту от Волка. Для надежной защиты
поросята собираются построить новый дом-крепость и разместить его так, чтобы он был
равноудален от их жилищ. Написать программу, которая по заданным координатам домов (все
три дома различны), определяла с точностью до трех знаков после запятой, координаты
нового дома.
Вход:в 3 строках по 2 числа, через пробел - координаты домов поросят.
- 18 -
Выход:2 числа , разделенные пробелом - координаты нового дома.
Пример:
Ввод:
Вывод:
100.0
125.125
109.329 187.554
101.0
250.125
102.0
250.250
Задача 52 «Космическое горючее»
В межгалактической лаборатории изобрели новый вид компактного топлива для
звездолетов, энергии одного атома которого хватает звездолету, чтобы преодолеть
расстояние в полтора световых года. В ознаменование этого выдающегося открытия
устраивается праздник, в программу которого входят большие гонки на звездолетах, с
огромным призовым фондом.
Организаторы праздника отправили N приглашений на
участие в гонках. Для демонстрации нового топлива предполагается заправить им все
звездолеты , участвующие в гонках, причем, чтобы все участники были в равных условиях,
им необходимо выделить одинаковое количество атомов нового горючего. Организаторы
не знают точного числа участников гонок (некоторые из тех, кому разосланы приглашения,
могут не принять участия в гонках). Организаторы хотят заготовить К атомов нового
топлива, при этом К должно нацело делиться на любое число участников от 2 до N. Новое
топливо очень дорогое, поэтому организаторы хотят, чтобы число К, удовлетворяя первому
требованию, было наименьшим. Необходимо написать программу, которая по числу
разосланных приглашений N (натуральное, 2<=N<=1000), вычисляла бы наименьшее число
атомов нового горючего - К, которое без остатка делится на любое число участников от 2 до
N.
Вход: число N (количество участников, натуральное 2<=N<=1000);
Выход: длинное число – результат.
Пример:
Ввод:
Вывод:
33
144403552893600
Задача 53 «Ярмарка»
Между населенными пунктами Дубово и Клиново имеется железнодорожная
ветка длиной S километров и с N остановочными пунктами, прономерованными по
порядку возрастания номеров по пути следования из Дубово в Клиново. Приближается
ярмарка. Организаторы
желают провести ее в таком месте, чтобы сумма расстояний,
которые преодолели по пути на ярмарку все ее участники, была наименьшей.О каждом
остановочном пункте имеются следующие сведения: Ri -расстояние от i-го пункта до
Клиново ( по железной дороге ), Ki -количество участников ярмарки, проживающих в i-м
пункте.Из Дубово на ярмарку поедет Z , а из Клиново - Y человек.Написать программу,
выводящую номер пункта, в котором следует проводить ярмарку ( если ярмарка в Дубово
- вывести 0 , если в Клиново - вывести число N+1, если возможны несколько пунктов вывести их номера в порядке возрастания). Ввод корректен. 0 < N < 1001,
0 < Ri, S <
9001,
0 <= Ki, X, Y<= 100 000 .
Вход: N+1 строка: в 1-й строке : N- число остановок, S - расстояние между селениями, Z, Y - число участников ярмарки из
Дубово и Клиново, в каждой из следующих N строк: Ri, Ki- сведения о i-м пункте.
Выход: номер или номера (в порядке возрастания) пункта(ов), где следует проводить ярмарку.
Пример:
Ввод:
3 13 3 1
12 2
8 2
1 3
Вывод:
2
Задача 54 «Номератор»
Для печатания номеров пользуются 15-ти разрядным номератором, который печатает
по порядку, начиная с заданного начального числа, пятнадцатизначные номера, если число
имеет меньше 15-ти разрядов то вместо отсутствующих разрядов печатаются ноли. На
- 19 -
печатание каждой цифры расходуется краска, ее расход пропорционален длине ломаной
линии, изображающей цифру. Высота цифры в два раза больше ее ширины, цифры имеют
следующие формы:
Написать программу, которая вычисляла бы минимальный, из заданного интервала (А
В), номер, начиная с которого для печати
серии из
К номеров расходуется
минимальное количество краски. 0 <= А, B < 1 000 000 000 000 000 ;
0 < K <= 100 000 ; A
<=B; 0 <= (B-A) < = 1000 000; границы интервала входят в интервал, а печатуемые номера
могут выходить за границы интервала.
Вход: 1-я строка - число А – начало интервала; 2-я строка - число В - конец интервала; 3-я строка - число К количество номеров в серии.
Выход: одно число - результат.
Пример:
Ввод:
Вывод:
987654320123456
987654321101001
987654321123456
78987
Задача 55 «Саранча»
На посевы напала саранча, каждые 8 часов ее численность
утраивается, а каждые 7
часов: сначала, если ее в этот момент нечетное количество – уменьшается на 1, а затем
уменьшается в 2 раза. Ее можно победить, если в момент истечения целого числа суток, с
момента появления саранчи, сжечь листок с магическим числом, делящимся без остатка на 11,
и равным кол-ву саранчи в момент сожжения листка. Найдите минимальное такое число, если
в момент появления численность саранчи была - М.
0<М<1000 000. При совпадении
моментов уменьшения и увеличения - сначала происходит уменьшение, а потом увеличение.
Ввод: М - численность саранчи в момент ее появления.
Вывод: число-результат.
Пример :
Ввод:
Вывод:
10001
648714
Задача 56 «Акр»
Одна страна состояла из одинаковых абсолютно во всем княжеств, которые были
настолько одинаковыми, что различить их не было никакой возможности, возникавшие из-за
этого всевозможные
проблемы,
неудобства и казусы можно описывать долго. Для
преодоления этих трудностей король придумал ввести в каждом княжестве свою систему
счисления, отличную от всех других систем счисления остальных княжеств, что и было
сделано. Княжества стали называться по основанию системы счисления, принятой в
данном княжестве для измерений и обозначений
абсолютно во всем, при этом для
обозначения и записи цифр стали использовать круглые скобки, оставили десять знаков
арабских цифр (0 - 9 ), а для обозначения цифр больших 9 стали использовать
соответствующие десятичной записи цифры числа, взятые в круглые скобки, например
цифру 15 записывали так: (15) . Чтобы не обидеть ни какое
из княжеств, их
нумерацию начали с основания 11 (основания от 2 до 10 не были приняты ни в
одном из княжеств).
Шейх решил купить себе по одному акру земли во всех
княжествах. Чтобы узнать, сколько это будет стоить, он послал по княжествам
своего визиря, который, зная только десятичную систему счисления, все вычисления,
выполнял в ней. Проезжая по княжествам, он - читал цены за акр земли (написанные
в принятых в княжествах системах, а на самом деле - везде одинаковые, только
записанные по-разному). Подсчитывал их общую сумму, опуская при этом скобки (считая
скобки простой особенностью
записи чисел в данной стране),
и, рассматривая
получившиеся, таким образом числа, как десятичные. В конце путешествия оказалось, что
визирь забыл посетить какое-то одно княжество. Необходимо написать программу, которая
- 20 -
по получившийся у визиря сумме S , количеству княжеств в стране – N и цене одного
акра земли в десятичной системе счисления, определяла номерa княжеств, в которых мог
не побывать визирь. Названия княжеств - натуральные числа из интервала [11 1000]. Цена
акра земли не превосходит 160 000.00
Ввод: три числа, разделенные пробелом - S - сумма, получившаяся у визиря, N- количество княжеств в стране, С цена акра земли в 10-ной системе счисления.
Вывод: числа-результаты,-названия, возможно не посещенного визирем, княжества.
Пример :
Ввод:
Вывод:
1739.000 7 177.000
13
Задача 57 «Космос»
В галактике II-GV-101 в звездной системе "ZX-2000", состоящей из N объектов, некоторые
из которых могут иметь совпадающие (т. е. одинаковые ) координаты в пространстве ( все три
координаты различных звездных объектов одинаковы, так как координаты
измеряются в
световых годах, а все эти различные звездные объекты расположены, например на одном и том же
маленьком астероиде, размеры которого пренебрежимо малы, по сравнению со световым годом).
В звездной системе заканчивается регламентный
срок эксплуатации
центральной
координационной станции, которая является началом отсчета внутренней координатной
системы, и через станцию поддерживается координация всех коммуникационных процессов в
звездной системе "ZX-2000". С момента строительства действующей
координационной
станции в звездной системе произошло много различных, существенных изменений, что
привело к ощутимому изменению координатной конфигурации всей звездной системы (создано
много новых объектов, разрушен ряд устаревших объектов). Действующая станция перестала
удовлетворять, как техническим,
так и координатным
требованиям, по отношению к
существующей на текущий момент звездной системе. В связи с этим, руководство звездной
системы на совете приняло решение: в новом месте построить новую координациоонную
станцию. сумма расстояний от нее до всех объектов системы должна быть минимальной, если
выполняется это условие для нескольких различных мест в звездной системе, то среди них
нужно выбрать такое, которое
ближе всего расположено по отношению к старой,
действующей сейчас, координационной станции. Составить программу, которая по вводимым
данным: числу объектов в системе - N и их координатам (Xi,Yi,Zi), вычисляла бы X,Y,Z координаты места
для строительства новой станции, чтобы они удовлетворяли всем
предъявляемым к месту расположения новой станции условиям.
расстояния вычислять по
общепринятой геометрической формуле для
трехмерного пространства. Станцию можно
строить только на имеющихся в системе объектах (ее координаты должны совпадать с
координатами одного из объектов). Старую станцию объектом системы не считать.
0<N<1001. В случае множества решений – выдать одно любое.
Ввод: 1-я строка – N – число объектов в системе; в каждой следующей из N строк – по три координаты
очередного объекта.
Вывод: три координаты, где должна располагаться новая станция.
Пример :
Ввод:
Вывод:
4
1 1 0
1 1 1
0 0 1
1 1 0
0 1 0
Задача 58 «Простые гороскопы» (100 баллов)
Будем считать, что у события «простой гороскоп», если - число, месяц, год даты его
начала и, а так же продолжительность в днях (дни начала и окончания включать в это число)
- выражаются простыми числами (числами не имеющими других делителей кроме самих
себя и единицы, число 1 - простым не является). Написать программу, которая, по
введенным начальной и конечной датам, вычисляла бы наибольшее количество различных
событий (события различны, если у них различен хотя бы один из временных признаков:
продолжительность,
дата
начала или
окончания)
с
«простыми гороскопами»,
- 21 -
продолжительностью не более Z дней, которые могли произойти между введенными датами
(сами даты включаются в интервал). Данные, даты и ввод - корректны. Начальная дата меньше
конечной ; 0 <Z<=10000; даты задаются в формате: ДД/ММ/ГГГГ, где ДД - две цифры число месяца, ММ- две цифры - номер месяца, ГГГГ- четыре цифры – номер года;
Вход:1-я строка - начальная дата; 2-я строка – конечная дата; 3-я строка – максимальная продолжительность события
в днях (Z) .
Выход: одно число - результат.
Пример :
Ввод:
Вывод:
01/01/1900
9492
31/12/2010
3737
Задача 59 «Карнавал»
Для участия в праздничном карнавальном шествии отобраны N участников, которых
сначала выстраивают в одну шеренгу по росту, а затем, по порядку следования в шеренге,
перестраивают в виде прямоугольника А на В человек так, что при их перестроении все
колонны и шеренги заполнены полностью и при этом ни один участник не остается вне
строя. Составить программу, находящую количество различных участников, которые не могут
оказаться соседями К-того по счету, от начала шеренги участника, в результате всех
возможных перестроений участников. Соседями участника считать участников построения,
стоящих справа, слева, впереди и позади от него в данном варианте перестроения.
Ввод: два числа: N и K – количество участников и номер участника.
Вывод: число - результат.
Пример :
Ввод:
16 1
Вывод:
8
Задача 60 «Иероглифы»
Шаблон, для написания иероглифов, задается в виде матрицы смежности вершин не
ориентированного (возможно псевдографа, но не мультиграфа) графа шаблона. Под иероглифом
будем понимать любой (кроме нулевого) подграф, из допустимых матрицей, заданного
шаблона-графа. Составить программу находящую количество различных иероглифов, которые
можно нарисовать при помощи заданного шаблона. М - число вершин графа, 1<М <31 ; ввод
корректен.
Ввод: 1-я строка М – число вершин графа, далее М строк - строки матрицы смежности вершин графа.
Вывод:. число - результат.
Пример:
Ввод:
Вывод:
3
7
0 1 1
1 0 1
1 1 0
Задача 61 «Ребус»
Вводится строка – ребус, состоящая из трех слов и знаков равно и плюс (каждый
матеметический знак встречается в строке ровно один раз). Написать программу, которая
выдавала бы все различные целые не отрицательные решения ребуса. При поиске решений
ребуса считать, что одинаковым буквам соответствуют одинаковые цифры, а разным
буквам - разные, не различая при этом больших и малых букв одного алфавита.
Ввод: строка – ребус.
Вывод:. все решения ребуса.
Пример:
Ввод:
Я+Я=МЫ
Вывод:
5+5=10
6+6=12
7+7=14
8+8=16
- 22 -
9+9=18
Задача 62 «Наибольшее простое»
Вводится натуральное число, не превосходящее числа 2147 000 000.
Написать программу, которая
выдавала бы наибольшее простое число, которое
возможно получить из .заданного числа вычеркиванием цифр. Можно вычеркивать любое
количество (и ноль тоже) цифр. Если решения нет выдать - число 0.
Ввод: М – число.
Вывод:. число - результат.
Пример:
Ввод:
123456
Вывод:
23
Задача 63 «Римское уравнение»
Составить алгоритм решения уравнения:
A*Z - B = 0 , где
A, B, Z - натуральные числа в римской нотации, не превышающие 3000, результат вывести в
римской нотации. Краткие правила римской системы счисления. Числа от 1 до 10 : 1 - I; 6 - VI; 2 II; 7 - VII; 3 - III; 8 - VIII; 4 - IV; 9 - IX; 5 - V; 10 - X. Десятки записываются по тем же правилам,
только вместо I используется Х, вместо V используется L - 50, вместо Х используется : С - 100.
Для записи сотен используются символы C, D - 500 и М - 1000 соответственно. Меньшая цифра
стоящая слева от большей этого же разряда вычитается, а справа – прибавляется, число
вычисляется как сумма разрядов. Вычитать разрешено не более одной младшей для данного
разряда цифры.
ПРИМЕР: СМLХХIХ = 900 + 70 + 9 = 979.
Ввод: в первой строке число - A, во второй число - B.
Вывод: решение уравнения или сообщение NO - если натурального решения нет.
Пример:
Ввод:
Вывод:
XIX
XLIX
CMXXXI
Задача 64 «Фотопластинки»
Фотопластинки прямоугольной формы размером А на В каждая разложили в виде
прямоугольника размером С на D пластинок без накладок одной на другую и зазоров между
ними, так что пластинки соприкасаются только одинаковыми по величине сторонами. Затем по
диагонали получившегося прямоугольника пропустили луч света. Составить программу,
подсчитывающую число засвеченных при этом пластинок по введенным размерам пластинки (А
В) и количествам пластинок в прямоугольнике (С на D) .Ввод корректен. Засвеченной считать
пластинку, у которой засвечено более одной точки.
Ввод: A B C D – исходные размеры.
Вывод: число-результат.
Пример:
Ввод:
5 7 18 12
Вывод:
24
Задача 65 «Гласные в названии»
Вводится целое число (меньшее 2100000000). Определить количество гласных букв в словесном
полном русскоязычном написании этого числа (правильное написание числа 1037: ОДНА
ТЫСЯЧА ТРИДЦАТЬ СЕМЬ).
Ввод: М - число.
Вывод: число-результат, количество гласных в полном написании введенного числа.
Пример:
Ввод:
Вывод:
1037
8
- 23 -
Задача 66 «Четыре цифры»
Вводятся четыре произвольные десятичные цифры. Написать программу, которая
находит и выводит максимальное
возможное число, которое можно
записать в
математической форме записи при помощи введенных цифр. В математической форме
записи операция возведение в степень не имеет значка, а обозначается записью чиселпоказателей степени
в виде верхних индексов. Программа должна выдать число в
математической форме записи в виде строки – арифметического выражения (не вычисляя
значение числа), для операции возведение в степень используя значок: ^.
В случае
введенных четырех нулей, достаточно выдать просто один нуль.
Ввод: А1 А2 А3 А4 - четыре цифры.
Вывод:. число – ответ в описанной в условии форме записи.
Пример:
Ввод:
Вывод:
1 2 0 0
2^100
Задача 67 «Тир»
Стрелок приходит в тир и ставит в банк сумму Х. Затем он стреляет, за точный
выстрел его сумму увеличивают на Р %, а за неточный уменьшают на Р%. Написать
программу, которая вычисляла количество различных возможных вариантов стрельбы, при
которых у игрока окажется сумма равная Х1. Проценты начисляются и снимаются с той
суммы, которая на счету у стрелка в момент произведения выстрела. Стрелок делает не
более 20 выстрелов.
Ввод: Х Х1 P.
Вывод:. число - ответ.
Пример:
Ввод:
Вывод:
1000
10
980.1
6
Задача 68 «Казино»
В казино собрались К игроков и сыграли К партий, причем каждый проиграл по
одной партии а во всех остальных выиграл. В каждой партии каждый игрок ставил в банк
все имеющиеся у него на этот момент деньги, если он проигрывал партию, то за счет его
денег удваивались суммы всех остальных выигравших игроков, а игроку доставался остаток
банка после удвоения сумм. При выигрыше (не проигрыше) партии сумма поставленная
игроком удваивалась. После окончания игры у всех игроков осталось поровну денег по М $.
Составить программу, подсчитывающую по введенному порядковому номеру проигранной
партии от начала игры, остатку денег М в конце игры, количеству сыгранных партий,
сумму денег, которая была до начала игры, у игрока проигравшего в этой партии. N K не
превосходят 30.
Ввод: N M К
Вывод: число-результат.
Пример:
Ввод:
5 3584 8
Вывод:
910
Задача 69 «Лазерный луч»
Прямоугольный параллелепипед с целочисленными размерами А В С
(A, B, C не превосходят 715000000) состоит из кубиков с длиной ребра равной единице. По
самой большой диагонали
параллелепипеда
пропустили лазерный луч. Составить
программу, вычисляющую количество кубиков с единичной длиной ребра, через которые
лазерный луч прошел более чем в одной точке.
Ввод: А В С - размеры параллелепипеда.
Вывод: число-результат, количество кубиков, через которые прошел луч более чем в одной точке.
Пример:
Ввод:
Вывод:
10 3 7
18
- 24 -
Задача 70 «Отрезание квадратов»
От прямоугольного листа бумаги с целочисленными длинами сторон отрезают
квадрат максимально возможного размера, если оставшаяся часть прямоугольник, а не
квадрат, то с ней делают то же, что и с исходным прямоугольником, так повторяют пока
оставшаяся часть не станет квадратом. Составить алгоритм, выводящий минимальные длины
сторон прямоугольника, при разрезании которого получится ровно N различных по
величине квадратов. N не превосходит 1000.
Ввод : N – число различных квадратов.
Вывод: минимальные ширина и длина листа.
Пример :
Ввод:
10
Вывод:
89 144
Лучше решить одну задачу - семью способами,
чем семь задач - одним способом, а еще лучше:
десять задач - десятью способами.
(Мудрость).
Глава 2. «Сюжет знаком, но новые оттенки».
В этой главе Вам предлагается перерешать задачи, с сюжетами которых
вы
познакомились в главе 1, но с некоторыми новыми дополнениями, ограничениями,
вопросами или другими нюансами. Будьте внимательны: одни дополнения или изменения в
условиях или вопросах задач не влияют существенно на изменения решений, а другие
могут не только кардинальным образом изменить само решение, но даже поменять метод
решения задачи.
Задача 1
а) Написать программу, которая зашифровывала бы текст по заданному в условии задачи
1 принципу.
в) Решить задачу а) для латинских букв.
Задача 2
а) Решить задачу, добавив к списку разрешенных знаков математических действий:
деление нацело и (или) возведение в степень.
в) Решить задачу, если знак математических действий между цифрами ставить
обязательно.
с) Решить задачу, если разрешено расставлять знаки математических действий между
любыми цифрами номера.
d) Решить задачу, если разрешено расставлять знаки математических действий между
цифрами и между буквами номера..
e) Решить задачу, если рассматривать пару букв как число в шестнадцатиричной
системе счисления.
f) Решить задачу, если рассматривать пару букв как число в шестнадцатиричной
системе счисления или как число в римской системе
нумерации.
g) Решить задачу, объединив дополнения и изменения пунктов: a, c - f.
Задача 3
- 25 -
а) Написать программу, которая вычисляла бы количество знаков в числе кусочков, на
которое распадется лист, для N до 1000000.
в) Решить задачу, если N не превосходит 100 (1000).
с) Решить задачу, если разрешено складывать лист только параллельно одной стороне
листа (т.е. складывать в полоску).
Задача 4
а) Написать программу, которая вычисляла бы количество различных
набранных командами.
в) Решить задачу для N команд, если N не превосходит 100 (1000).
сумм
баллов,
Задача 5
а) Написать программу, которая выдавала бы номера М идущих подряд вагонов с
нечетными номерами число пассажиров, в которых максимально, а количества свободных
мест попарно различны.
в) Решить задачу, если N не вводится среди исходных данных.
Задача 6
а) Написать программу, которая вычисляла бы процент возрастания нагрузки по величине
начальной и конечной нагрузок и периоду времени между ними.
в) Написать программу, которая вычисляла бы дату начала тренировок, по проценту
увеличения нагрузки в месяц, суммарной величине выполненных нагрузок, заданной дате,
величине нагрузки и дню недели, на заданную дату, если спортсмен тренируется по
понедельникам, средам и пятницам.
Задача 7
а) Написать программу, которая не вычитала бы, а сравнивала дроби, у которых целые
числители и знаменатели.
в) Решить задачу, если числители и знаменатели не больше 1000000000.
с) Решить задачу, для произведения дробей с числителями и знаменателями до 2000 000
000.
Задача 8
а) Написать программу, которая вычисляла бы количество различных пар, имеющих
между собой одну общую точку, отрезков, целиком лежащих на данном отрезке, обе
координаты концов которых - целочисленные.
в) Решить задачу, если концы не принадлежат отрезкам.
с) Решить задачу на прямой (с одной координатой концов отрезка).
d) Решить задачу в пространстве (с тремя координатами концов отрезка).
Задача 9
а) Написать программу, которая вычисляла бы порядковый номер введенного члена
последовательности, полученной по описанному в задаче правилу, если известны два первые
члена последовательности.
в) Решить задачу, если каждый последующий член последовательности получается путем
прибавления к сумме двух предыдущих членов, суммы цифр двух предыдущих членов.
с) Решить задачу, если каждый последующий член последовательности получается путем
прибавления к сумме двух предыдущих членов, суммы цифр всех предыдущих членов.
d) Решить задачу, если каждый последующий член последовательности получается путем
прибавления к сумме двух предыдущих членов суммы цифр суммы всех предыдущих
членов.
Задача 10
а) Написать программу, которая вычисляла бы минимальное количество ходов за
которое конь достигнет заданной клетки.
в) Решить задачу, для условия точно за М ходов.
- 26 -
с) Решить задачу на доске свернутой в цилиндр.
Задача 11
а) Написать программу, которая вычисляла бы минимальное ближайшее число, которое в
дополнение к условиям задачи само имеет два решения данной задачи.
в) Решить задачу, для условия замены только любой крайней цифры.
Задача 12
а) Написать программу, которая
вычисляла бы количество
граждан в
Параллелопландии.
в) Написать программу, которая вычисляла бы количество членов общества кубов в
Параллелопландии.
с) Написать программу, которая
вычисляла бы количество
родственников у
маленького кубика в Параллелопландии.
d) Написать программу, которая вычисляла бы количество родственников у маленького
кубика среди кубов в Параллелопландии.
е) Решить задачи а-d для плоскости (для двух координат).
Задача 13
а) Написать программу, которая вычисляет количество недоступных клеток.
в) Решить задачу, заменив коней королями, ходящими на одну клетку в любом
направлении.
с) Решить задачу на доске свернутой в цилиндр.
Задача 14
а) Написать программу, которая по заданному паролю до 8 символов, выдавала все
возможные варианты для этого пароля.
в) Решить задачу, для малых латинских букв.
с) Решить задачу, для любых букв.
Задача 15
а) Написать программу, которая
вычисляла
интервале, не имеющих "разноделящихся" делителей.
в) Решить задачу, если цифры в отдельно взятом
не могут.
с) Написать программу, которая
вычисляла
"разноделящийся" НОД.
d) Написать программу, которая
вычисляла
"разноделящееся" НОК.
бы
количество чисел на
заданном
"разноделящемся" числе повторяться
бы
для
двух
заданных чисел, их
бы
для
двух
заданных чисел, их
Задача 16
а) Написать программу, которая вычисляла бы количество ушедших (родившихся,
умерших) из муравейника за Т сезонов муравьев.
в) Решить задачу, если каждый последующий сезон коэффициент рождаемости К
изменяется по закону КN=К*Ln(X/K), где KN-новый коэффициент, К –старый, Х – текущая
численность муравьев в муравейнике.
с) Решить задачу, если продолжительность жизни рождающихся каждый последующий
сезон муравьев изменяется по закону GN=G*Ln(X/M), где GN-новая продолжительность, G –
старая, Х и М – текущая и начальная численность муравьев в муравейнике.
Задача 17
а) Написать программу, которая вычисляла бы
количество возможных различных,
правильных решений данной задачи для заданной строки.
в) Решить задачу, пробел символом не считая.
- 27 -
с) Решить задачу для текста длиной до 20 000 символов.
Задача 18
а) Написать программу, которая вычисляла бы, число виз, срок действия которых, в
днях, больше (меньше, равен) заданного числа М.
в) Решить задачу, если день открытия и (или) закрытия визы не входят в срок ее
действия.
Задача 19
а) Решить задачу, если клетку закрашивать в один из цветов не обязательно.
в) Решить задачу для квадратной доски.
с) Решить задачу, если проводят не одну, а две диагонали.
Задача 20
а) Написать программу, которая вычисляет количество недоступных деревьев для
заданного дерева.
в) Решить задачу, заменив коней королями, ходящими на одну клетку в любом
направлении.
с) Написать программу, которая вычисляет не только количество прыжков, а и длину
кратчайшего допустимого маршрута между заданными деревьями.
Задача 21
а) Написать программу которая, находит наименьшее натуральное решение неравенства
Х!>=B.
в) Решить задачу, если длина В не превосходит 2000.
Задача 22
а) Написать программу, которая
вычисляла бы наибольшую длину интервала,
продаваемых билетов, не содержащего "счастливых" билетов.
в) Решить задачу, если стадион каждый матч заполняется полностью.
с) Написать программу, которая вычисляла бы количество всех "счастливых" билетов
для N- значных чисел, для N не превосходящих 100 (1000, 1000000).
d) Решить задачу, если номера "счастливых" билетов, вдобавок еще не должны нацело
делиться на 11 (2, 3,5,9).
Задача 23
а) Написать программу, которая вычисляла для каждого цвета фишек, количество
различных клеток, в которых они могут собраться, выполняя требования условия задачи.
в) Решить задачу, если в каждой клетке одновременно может находиться не более одной
фишки.
с) Решить задачу для всех фишек, не зависимо от их цвета.
Задача 24
а) Написать программу, которая вычисляла бы максимальное количество вытянутых
морковок, при наихудшем исходе, для заданного набора листков.
в) Решить задачу, если Кролик потерял один из листков, и помнит, что на нем было,
написано число не большее и (или) не меньшее чисел на остальных семи листках.
с) Решить задачу для 2 (3, 5, 10, Y) листков.
Задача 25
а) Написать программу, которая вычисляла бы, емкость батареи между заданными
номерами спаек.
в) Решить задачу, если общая емкость батареи известна, а надо определить емкость
одного конденсатора, присоединенного между заданными спайками.
- 28 -
Задача 26
а) Решить задачу для кубиков имеющих общие ребра с заданным кубиком.
в) Решить задачу для кубиков имеющих хотя бы одну общую точку с заданным
кубиком.
с) Решить задачу, если нумерацию в слоях проводят по спирали но в обратном
направлении вращения.
Задача 27
а) Написать программу, которая
вычисляет сколько раз количество различных,
возможных значений таблицы будет делиться без остатка на заданное натуральное число М
не превосходящее 2000000.
в) Написать программу, которая вычисляет количество десятичных знаков в числе количестве различных, возможных значений таблицы.
Задача 28
а) Написать программу которая, находит представление числа с заменой требования
максимального Х на минимально возможное большее 1.
в) Решить задачу, если степени А и В не обязательно одинаковы, но сумма их
степеней должна быть максимальна (минимальна, фиксирована, ограничена).
Задача 29
а) Написать программу, которая вычисляла бы длину части ломаной, расположенной
выше (ниже, не выше, не ниже) оси ОХ.
в) Решить задачу, если ломаная задана в пространстве.
с) Написать программу, которая вычисляла бы количество точек "самопересечений"
ломаной.
d) Написать программу, которая вычисляла бы количество прямых углов, которые
образуют между собой звенья ломаной, если ломаная без точек "самопересечений".
e) Решить задачу d) , если ломаная c "самопересечениями".
Задача 30
а) Написать программу, которая вычисляла для заданного вида подарка, максимальное
количество предметов данного вида, которое может быть снято с ёлки, выполняя
требования условия задачи.
в) Решить задачу, если при снятии двух любых разных предметов появляется конфета, а
при снятии одинаковых один такой же, как снятый предмет.
с) Написать программу, которая вычисляла, какого вида подарков
может быть снято
с ёлки максимальное количество, выполняя требования условия задачи, для заданных
начальных условий.
Задача 31
а) Написать программу, которая представляет число в виде минимального, большего 1,
натурального числа одинаковых целых множителей.
в) Написать программу, которая представляет число состоящее из не более чем 15
десятичных знаков.
Задача 32
а) Написать программу, которая вычисляла бы минимальный вес груза, который
можно (нельзя) взвесить заданным набором гирь.
в) Написать программу, которая вычисляла бы максимальный, меньший заданного,
вес груза, который можно (нельзя) взвесить заданным набором гирь.
с) Решить задачу, если гири и груз можно ставить только на разные чашки весов.
- 29 -
Задача 33
а) Написать программу, которая вычисляла для заданного прямоугольника количество
не закрашенных малых прямоугольников.
в) Решить задачу, если заливали и те прямоугольники, у которых диагонали прошли по
границе.
с) Решить задачу для одной диагонали.
d) Решить задачу в) для одной диагонали .
Задача 34
а) Написать программу, которая вычисляла для заданной цифровой
части номера,
максимальное количество буквенных сочетаний, которые соответствуют условиям "дважды
счастливого" номера.
в) Решить задачу при замене требования максимального количества номеров на
минимальное.
с) Написать программу, которая вычисляла количество всех возможных, различных
"дважды счастливых" номеров.
Задача 35
а) Решить задачу, если номер выбрасываемого ящика определяется номером (равен)
предыдущего выброшенного ящика.
в) Решить задачу при замене требования минимального количества выброшенных ящиков
на максимальное.
Задача 36
а) Решить задачу, если число страниц не превосходит 10000.
в) Решить задачу при замене требования максимального количества страниц
на
минимальное.
с) Написать программу, которая вычисляла количество всех возможных, различных
вариантов выпадения страниц для заданного номера первой выпавшей страницы.
Задача 37
а) Решить задачу, если число знаков в числах не превосходит 1000.
в) Решить задачу при замене двоичной системы счисления на К-ичную.
с) Написать программу, которая решала бы квадратное уравнение с заданными,
согласно условия задачи, коэффициентами.
Задача 38
а) Написать программу, которая вычисляет число подобных, но не равных (треугольники
все соответственные углы у которых равны, а стороны нет) треугольников.
в) Написать программу, которая вычисляет максимальное число треугольников у
которых третья вершина лежит на одной прямой параллельной общей прямой.
Задача 39
а) Написать программу, которая вместо ответа YES выводила бы количество различных
способов которыми это можно сделать.
в) Решить задачу, если в строках использовать как большие так и малые буквы.
Задача 40
а) Написать программу, которая вычисляла бы по новой и старой ценам сплава и
количеству добавки цену добавленного компонента.
в) Решить задачу, если добавили М компонентов.
Задача 41
- 30 -
а) Написать программу - чекер, которая проверяла бы правильность записанного в
файле магического квадрата.
в) Решить задачу отдельно для четных и нечетных размерностей квадратов.
с) Решить задачу для «магических» кубов.
Задача 42
а) Написать программу, которая кроме того запрашивала номер года и чмсло месяца и
выводила название дня недели.
в) Решить задачу, если границы времени суток не входят ни в один интервал.
Задача 43
а) Написать программу, которая вычисляла бы по количеству ударов и срубленному
числу голов наибольшее (наименьшее) начальное число голов.
в) Решить задачу, если отрастает число голов равное сумме цифр числа только что
отрубленных последним ударом голов.
с) Написать программу, которая вычисляла бы по количеству срубленных голов
наибольшее (наименьшее) число ударов, которыми можно это сделать.
Задача 44
а) Написать программу, которая проверяла бы можно или нельзя при помощи заданного
набора кружек отмерить заданный объем воды.
в) Решить задачу если воду из кружки в кружку и обратно из результирующей емкости
переливать нельзя.
с) Решить задачу для N кружек.
Задача 45
а) Написать программу, которая вычисляла бы с какого дня недели должен начинаться
год, чтобы между указанными датами было наибольшее (наименьшее) количество пятниц
(понедельников) 13 .
в) Написать программу, которая вычисляла бы максимально возможное число пятниц
13-го между заданными датами.
Задача 46
а) Написать программу, которая вычисляла для заданного треугольника минимальный
(максимальный) периметр вписанного квадрата.
в) Решить задачу, если сторона квадрата лежит на любой, а не на большей стороне
треугольника.
с) Решить задачу для квадрата, у которого на сторонах треугольника лежат только три
вершины, а четвертая вершина внутри треугольника.
Задача 47
а) Написать программу, которая
вычисляла, для заданного текста
какая
из
контрольных сумм повторяется максимальное количество раз.
в) Решить задачу для русских букв.
с) Написать программу, которая
вычисляла, какое наибольшее количество раз
повторяется в тексте одна из "контрольных" сумм.
Задача 48
а) Решить задачу, если слова могут состоять, как из больших, так и из малых букв, а
при проверке вхождений регистры не различать.
в) Решить задачу при отмене требования вхождения буквы не более чем в одно
вхождение одного слова в другое.
Задача 49
- 31 -
а) Решить задачу, если число цветов не превосходит 255.
в) Написать программу, которая вычисляла, какое наибольшее количество раз подряд не
встречалась лампочка одного из цветов.
с) Написать программу, которая вычисляла, какого цвета наибольшее количество раз
подряд не встречалась лампочка в гирлянде.
d) Написать программу, которая вычисляла, какого цвета наибольшее количество раз
подряд встречалась лампочка в гирлянде.
e) Решить задачи в) и с) одновременно.
Задача 50
а) Написать программу, которая
вычисляла, для заданных исходных данных
максимальное (минимальное) возможное количество побед (поражений).
в) Решить задачу, если за победу дается два очка, а не три.
с) Написать программу, которая вычисляла, какое наилучшее (наихудшее) место мог
занять в данном чемпионате "Локомотив".
Задача 51
а) Решить задачу, если дома могут совпадать.
в) Решить задачу при замене требования равноудаленности нового дома от жилищ на
требование минимальности суммы расстояний от жилищ до нового дома.
Задача 52
а) Написать программу, которая
вычисляла,
максимальновозможное количество участников.
в) Решить задачу для N>1000.
для
заданного
числа
атомов,
Задача 53
а) Написать программу - чекер, которая
проверяла бы правильность и полноту
выданных ответов - номеров станций.
в) Решить задачу, если станции соединены сетью железнодорожных веток, а не одной
веткой.
с) Решить задачу для станций, расположенных по замкнутой круговой ветке, по которой
можно ехать в одном (двух) направлении.
Задача 54
а) Написать программу, решающую задачу для N разрядных чисел.
в) Решить задачу, если формы цифр заменить на такие как на почтовых конвертах для
написания индекса.
с) Написать программу, которая решала бы задачу для условия: наибольшее
количество краски, вместо наименьшего.
Задача 55
а) Написать программу, которая проверяла бы можно или нельзя победить саранчу,
при замене постоянных 8 и 7 часов на переменные Т1 и Т2.
в) Решить задачу если при совпадении моментов обратный порядок: сначала увеличение
а затем уменьшение.
Задача 56
а) Написать программу, которая
вычисляла бы, какое наибольшее
количество
княжеств может оказаться в списке возможно забытых визирем.
в) Написать программу, которая вычисляла бы цену, для которой максимально
возможное количество различных кандидатов в забытые визирем княжества.
Задача 57
- 32 -
а) Написать программу, которая вычисляла для заданной системы,
минимальный
объем куба (в координатных кубических единицах), в который целиком поместится вся
система .
в) Решить задачу, если старую станцию считать объектом системы.
с) Решить задачу, если станцию можно строить не только на объекте, но и в любой
другой точке пространства.
Задача 58
а) Написать программу, решающую задачу без ограничения на максимальную
продолжительность события.
в) Решить задачу, если даты начала и окончания события считать как один день в
продолжительность события.
с) Написать программу, которая решала бы задачу без условия простоты числа продолжительности события в днях.
Задача 59
а) Написать программу, которая
вычисляла бы, какое наибольшее
количество
участников
может оказаться соседями К-го участника, если число
участников не
превосходит N.
в) Написать программу, которая вычисляла бы номер участника, для которого
максимально (минимально) возможное количество различных соседей, если число участников
не превосходит N.
с) Решить задачу, если участников можно строить не только шеренгами но и по
спирали.
d) Решить задачу, если вдобавок соседями считать еще и участников, стоящих рядом
по-диагонали от участника.
Задача 60
а) Написать программу, которая
вычисляла для заданного числа иероглифов,
минимальное число вершин в графе-шаблоне.
в) Решить задачу, если шаблон-граф может быть мультиграфом.
с) Решить задачу, если иероглифом считатьть любой путь из шаблона-графа.
d) Решить задачу, если граф-шаблон ориентированный.
Задача 61
а) Написать программу, которая вычисляла бы количество различных решений ребуса.
в) Решить задачу, если вместо знака плюс будет знак минус (умножить).
с) Решить задачу, если вместо знака плюс в ребусе может быть любой из знаков:
плюс, минус, умножить, разделить, разделить нацело.
Задача 62
а) Написать программу, которая
вычисляла бы, какое наибольшее
количество
различных простых чисел можно получить из заданного числа.
в) Написать программу, которая вычисляла число из заданного интервала, для которого
максимально возможное количество различных простых
чисел, которые можно из него
получить вычеркиванием цифр.
с) Решить задачу, если нельзя вычеркивать 0 цифр.
d) Решить задачу, если, вместо требования простоты чисел, поставить требование
четности (нечетности) чисел.
Задача 63
- 33 -
а) Написать программу, которая вычисляла Z в десятичной системе счисления, в том
числе и дробные.
в) Решить задачу, если можно задавать отрицательные римские числа, записав перед
числом знак минус.
Задача 64
а) Написать программу, которая вычисляла бы количество различных пересечений луча
света с различными сторонами различных пластинок.
в) Решить задачу, если вместо прямоугольных будут квадратные пластинки с единичной
длиной сторон.
с) Решить задачу, если пластинки, у которых засвечено только по одной точке, то же
считать в число засвеченных.
Задача 65
а) Написать программу, которая вычисляла бы количество различных гласных в
написании названия числа.
в) Решить задачу, где вместо гласных считать согласные (все и различные).
с) Решить задачу, если вводимое число может содержать до 18 разрядов.
Задача 66
а) Написать программу, которая решала бы, задачу для трех (пяти, шести, К) цифр.
в) Написать программу, которая выдавала все четверки цифр для которых возможно
неоднозначное решение задачи.
с) Решить задачу для системы счисления с основанием N (3<N<33).
d) Решить задачу, если, к требованию максимальности, добавить требование четности
(нечетности) числа.
Задача 67
а) Написать программу, которая
вычисляла бы, какое наибольшее
количество
выстрелов может сделать стрелок, чтобы задачу гарантированно можно было решить без
длинной арифметики.
в) Написать программу, которая вычисляла число выстрелов, для которого для решения
задачи на PASCALе не достаточно типа REAL.
с) Решить задачу, если процент начисляется и снимается с первоначальной суммы.
d) Решить задачу, если число выстрелов до 50 (100, 1000).
Задача 68
а) Написать программу, которая вычисляла бы, какое наибольшее количество игроков
могло участвовать в игре для заданного конечного остатка денег у игроков.
в) Написать программу, которая вычисляла максимальную и минимальную суммы денег,
которые были у игроков до игры (в течении игры).
с) Решить задачу, если остатки денег у игроков после игры различны.
Задача 69
а) Написать программу, которая
вычисляла бы, какое существует наибольшее
количество различных по размерам параллелепипедов, у которых число прожженных лазерным
лучом кубиков равно заданному числу, и объем которых не превосходит заданной величины.
в) Написать программу, которая вычисляла число кубиков, по которым луч прошел
ровно в одной точке.
Задача 70
а) Написать программу, которая вычисляла бы, какое количество различных квадратов
с длинами сторон выражающимися простыми числами можно получить, разрезая
прямоугольник заданных размеров.
- 34 -
в) Написать программу, которая
вычисляла длину линий разрезания
прямоугольника заданных размеров.
с) Решить задачу, если нужно получить N квадратов (необязательно разных)
минимальной длине линий разрезания.
d) Решить задачу, если убрать требование различности по величине для квадратов.
для
при
Что делать? Что делать?…..Задачи решать!|
(Методическая шутка).
Глава 3. Алгоритмы решения задач и методические
рекомендации к их решению.
В этой главе размещены словестные описания алгоритмов решения задач из первой
главы, для некоторых задач даны методические рекомендации или пояснения для решения.
Часто встречающйся в данной главе термин длинная арифметика означает поразрядное
моделирование чисел, которые не помещаются в стандартные типы среды программирования
, в виде массивов или строк и выполнение действий над этими числами. Сокращение НОД
означает - наибольший общий делитель. Материалы данной главы отвечают на вопрос: «Что
нужно делать для решения задачи?» Ответ на вопрос: «Как это практически реализовать?»
вы сможете найти в главе «Листинги решений задач для языка программирования
PASCAL».
Задача 1.
Составляем шаблоны, отдельно для больших и малых русских букв, так, чтобы
буквы в них следовали в алфавитном порядке. Составляем алгоритм зашифровки текста по
описанным в условии правилам, а затем с его помощью получаем два, соответствующих
шаблонам, ключа для расшифровки текстов. Ключи получаются зашифровкой шаблонов при
помощи алгоритма зашифровки. Читаем зашифрованный текст и расшифровываем его
посимвольно: берем символ из зашифрованного текста, находим его порядковый номер в
одном из ключей, а затем, в качестве расшифрованного символа берем символ, с таким же
номером в соответствующем ключу исходном шаблоне.
Задача 2.
Задача решается поэтапно: сначала - проверка существования правильного римского
числа, соответствующего введенной паре букв, если числа нет, то выдать в качестве
результата «0», а при наличии такого числа, перевод его в арабскую форму записи, а затем,
следующий этап - поиск и подсчет количества всевозможных решений для найденного
числа. Поиск и подсчет всевозможных решений осуществляем методом полного перебора
для всех возможных чисел (от 00 до 99) и всех возможных знаков между ними. Для
данной задачи проверку корректности двухзначного римского числа и его перевод можно
так же осуществить методом полного перебора и исключения недопустимых вариантов (18
случаев) римского числа из допустимых римских цифр, случай когда одна из введенных букв
не является римской цифрой, распознается и решается еще проще предыдущего.
- 35 -
Задача 3.
Форма и начальные пропорции листа не влияют на результат. Каждое складывание
листа уменьшает один из его размеров в два раза, при этом каждый из размеров
уменьшается поочередно, а конечные размеры сложенного разрезаемого листа будут
зависеть от четности - нечетности числа складываний - N. Влияет на результат и вид
разрезания: диагонали у сложенного листа две, и - разрезание по одной из них приводит к
тому, что линия разреза проходит через центр сложенного листа, разрезание по второй оставляет центр нетронутым, легко убедиться, что во втором случае лист распадется на
большее число кусочков, чем в первом (можно убедиться практически для малых N,
например, для 2 складываний: 1-й способ разрезания - лист распадается на 4 кусочка, 2-й
способ на 5 кусочков). Эта закономерность справедлива для любых N и далее нас будет
интересовать лишь второй способ. Записав для четных и нечетных N длины сторон
сложенного прямоугольника через длины сторон исходного, посмотрев сколько раз одни
помещаются в других, можно вывести формулы числа кусочков для четных и нечетных N:
К=2^( n-1)+2^( n/2)+1 - для четных и - К=2^(n-1)+2^((n-1)/2)+2^((n-3)/2)+1 - для нечетных.
Из формул видно, что для точных расчетов по ним для N >31 нужна длинная арифметика,
реализуем ее и выводим результат.
Задача 4.
Для успешного решения нужно предусмотреть и аккуратно реализовать их
правильный перебор, для всех возможных случаев количества баллов (в том числе равенства
баллов у нескольких команд) и соответствующих баллам мест команд.
Задача 5.
Задача требует внимательности: что дано и что надо найти, и предусмотреть, что
ответов может быть не один, а несколько и все их вывести.
Задача 6.
Для решения задачи требуется не начислять, а снимать заданные проценты с числа.
Задача 7.
Решение задачи требует аккуратной алгоритмизации правила вычитания и
сокращения дробей, предусмотрев при этом, чтобы не выйти за пределы целочисленных
типов и обойтись без длинной арифметики, вычисление НОД и сокращение на него раньше,
чем делается действие умножение.
Задача 8.
Решение задачи состоит из двух частей: первая - нахождение количества точек,
имеющих обе целочисленные координаты, и принадлежащих заданному отрезку, и вторая
часть - нахождение числа различных отрезков, образуемых найденными в первой части
точками. Первую часть реализуем методом полного перебора, вторую - методом
комбинаторных рассуждений.
Задача 9.
Решение задачи требует аккуратной алгоритмизации описанных в условии правил
вычисления последующих членов последовательности из предыдущих, реализованных в
длинной арифметике.
Задача 10.
Для успешного решения задачи требуется так называемый «волновой» метод, или
иначе метод фронтального просмотра, который заключается в следующем: очищаем таблицу,
соответствующую полю, помечаем начальное положение коня, затем, по количеству
- 36 -
заданных шагов повторяем действия: на каждом следующем шаге помечаем клетки в
которые конь может попасть за один ход из клеток помеченных на предшествующем шаге.
После «разметки» доски, для нахождения ответа необходимо подсчитать на доске клетки
оставшиеся не помеченными.
Задача 11.
Берем заданное число и, заменяя в нем цифру, получаем новое число, проверяем
его на выполнение требований условия задачи: если удовлетворяет - выдаем его в качестве
ответа, иначе получаем следующее число. Продолжаем процесс пока не получим ответ или не
исчерпаем все варианты замен цифры.
Для нахождения ближайшего и наименьшего
решения, организуем замену цифры, начиная с младшего разряда. Внутри разряда замену
цифры осуществляем поочередно в сторону уменьшения и увеличения сначала на единицу,
затем на 2 и т.д. Если все замены исчерпаны, а ответ не найден - переходим в
следующий разряд и повторяем процесс замены цифры в нем.
Проверку делимости числа на количество различных знаков, необходимых для его записи
в N -ричной системе счисления, ведем так:
1.Заводим массив счетчиков знаков на N элементов и обнуляем его.
2.Пока частное не меньше N - делим его на N, а получающиеся при этом остатки от деления
считаем в соответствующих счетчиках. После цикла увеличиваем, счетчик соответствующий
знаку частного (меньшего N) .
3. Подсчитываем в массиве число не нулевых счетчиков - это и есть количество различных
знаков нужных для его записи в N-ричной системе.
4.Проверяем делимость числа на полученное в п. 3 количество.
Задача 12.
Если подсчитать общее количество различных параллелепипедов (S1), количество различных
кубов (S2), различных параллелепипедов, в которые входит адресный кубик (S3), количество
различных кубов в которые входит адресный кубик (S4), то результат получается как разность:
(S1-S2)-(S3-S4).
Подсчет вышеуказанных сумм производится путем полного перебора всех возможных
значений трех размеров для кубов и параллелепипедов и проверки вхождения при этом в них
адресного кубика.
Чтобы искомый результат не вышел за пределы типа longint на входных данных близких к
максимальным значениям размеров, указанных в ограничениях, члены всех четырех сумм
считаются одновременно за один проход и те, которые имеют знак минус, суммируются к
результату раньше тех, которые имеют знак плюс.
Корректировочная функция используется для подсчета числа вхождений адресного кубика в
куб или параллелепипед заданного размера, она вычисляет величину поправки.
Задача 13.
Задача решается «волновым» методом: очищаем таблицу (заполняем нулями),
соответствующую полю, расставляем белых коней и помечаем отрицательными числами
клетки, в которых они находятся или которые они держат под боем, помечаем начальное
положение коня, затем, пока в конечной клетке стоит ноль и при прохождении поля есть
клетки в которые может сходить, но еще не ходил черный конь, повторяем действия: на
каждом следующем шаге помечаем разрешенные для ходов клетки числом, соответствующим
номеру шага от начала, в которые конь может попасть за один ход из клеток помеченных
на предшествующем шаге. После завершения цикла, если в конечной клетке положительное
число, то выдать это число в качестве ответа, иначе выдать ответ "пройти невозможно".
Задача 14.
Составляем шаблоны из букв и из соответствующих этим буквам коэффициентов
возможных вариантов их применения. Затем, проходим по всем буквам введенного пароля,
- 37 -
перемножая соответствующие буквам пароля коэффициенты, учитывая ограничения задачи,
перемножение выполняем с использованием длинной арифметики.
Задача 15.
Решение задачи требует аккуратной алгоритмизации описанных в условии правил
вычисления "разноделящихся" чисел, подсчета количества их делителей, предусмотрев это,
как для положительных, так и для отрицательных чисел. Поиск числа на интервале
осуществляется методом полного перебора чисел интервала.
Задача 16.
Задача требует написания и аккуратной реализации формализованной модели явлений
и событий описанных в условии, с сохранением промежуточных значений в таблице, и
последовательного вычисления последующих значений из предыдущих, при соблюдении
описанных в условии правил.
Задача 17.
Заведем таблицу счетчиков количества символов на 256 элементов, обнулим её.
Читаем вводиую строку и подсчитываем количества входящих в нее различных символов,
сохраняя значения в таблице под индексами соответствующими ASCII кодам символов
строки. Формируем перевертыш, проходя от начала в конец по части печатных символов
таблицы (чем обеспечиваем возрастание кодов в левой части перевертыша): если элемент
таблицы больше двух, делим его нацело на два и столько раз берем в левую часть символ,
код которого равен индексу элемента. Формируем правую часть перевертыша зеркальным
отражением левой части, вставив предварительно в середину любой символ, который
встречался в исходной строке нечетное число раз, если таковой есть. Выводим длину и сам
перевертыш в качестве результа.
Задача 18.
Для решения задачи необходимо упорядочить в порядке следования все даты
открытия и закрытия виз, причем при упорядочении необходимо различать даты открытия
и даты закрытия.
Алгоритм решения состоит из следующих этапов:
1. Читаем исходные данные в символьном виде, дополняя при этом даты признаком
открытия или закрытия виз (признак открытия - дополняемый символ - должен иметь код
меньше кода признака закрытия визы при упорядочении дат по возрастанию и наобарот при
упорядочении дат - по убыванию). Данные помещаем в массив.
2. Упорядочиваем (сортируем) массив, полученный в п. 1. Заданный в задаче формат
позволяет сортировать даты в символьном виде не изменяя их.
3.Просматриваем упорядоченный массив от начала до конца поэлементно, если очередной
элемент - открывающая визу дата, то текущий счетчик открытых виз увеличиваем на
единицу, в противном случае - уменьшаем, ведя при этом одновременно поиск
максимального значения счетчика открытых виз.
4. Выводим в качестве результата максимальное значение счетчика открытых виз из п. 3.
Задача 19.
Для решения нужно подсчитать (используя НОД) количество клеток, пересеченных
диагональю, и прибавить его к общему числу клеток - получим число клеток у второго
художника, затем, используя формулы комбинаторики, получить неравенство:
K^(A*B) <= X^(A*B+A+B- НОД(А,В)), решив которое относительно целого Х и
получим ответ задачи.
Задача 20.
Преобразуем таблицу расстояний в таблицу прыжков, заменяя элемент матрицы
единицей, если его значение не больше длины прыжка белки, и на максимально большое
- 38 -
число в противном случае. Применяем к преобразованной матрице алгоритм Флойда. Читаем
элемент на пересечении М строки и Z –го столбца, если он – большое число, то выдаем ответ
"NO", иначе выдаем значение элемента в качестве ответа.
Задача 21.
Решение задачи требует аккуратной реализации длинной арифметики. Умножаем
длинное число на очередной множитель и сравниваем его с заданным В, если длинное
число не больше В, то увеличиваем на единицу множитель и повторяем тело цикла, в
противном случае - прекращаем цикл и выдаем в качестве ответа уменьшенный на единицу
множитель.
Задача 22.
Моделируем процесс продажи билетов если счет начинается с первого. Затем, для
всех сдвигов по кругу от начала отсчета соответственно подсчитываем - сколько среди
проданных счастливых билетов, ищем, для какого сдвига, число счастливых билетов максимально, запоминая при этом значение максимума, которое и выводим в качестве
ответа.
Задача 23
Необходимо разделить фишки по цветам, согласно их начальной расстановке, а затем
решить задачу отдельно для каждого цвета. Решая задачу для отдельного цвета, сначала,
определяем координату клетки, собравшись в которой фишки данного цвета сделают
минимальное число ходов по данной координате, а затем, подсчитываем, сделанное при этом
количество ходов. Для каждого цвета фишек считаем координату и количество ходов по
горизонтали отдельно и по вертикали отдельно, в качестве результата берем их сумму (
раздельный по координатам расчет количества ходов допустим потому, что фишки могут
ходить только в вертикальном или горизонтальном направлениях, т.е. за один ход
изменяется на единицу одна координата фишки, а сумма ходов фишки складывается из,
независимых друг от друга, сумм вертикальных и горизонтальных ходов). Для определения
координаты, собравшись в которой фишки данного цвета сделают минимальное число ходов
по данной координате, используем алгоритм нахождения координаты точки, сумма
расстояний от которой до всех остальных из заданного множества - минимальна. Сущность
этого алгоритма состоит в упорядочивании координат заданного множества точек и выбора
в качестве результата координаты, находящейся на средней ( или одной любой из двух
средних для четного числа точек ) позиции.
Алгоритм подсчета наименьшего количества ходов по одной координате для одного из
цветов состоит из следующих этапов:
1. Читаем исходные данные: количество фишек цвета и массив одной из координат фишек
этого цвета.
2. Упорядочиваем (сортируем) массив, из п. 1. и определяем координату до которой
наименьшее число ходов (это значение координаты середины упорядоченного массива ).
3. Просматривая массив, подсчитываем сумму количеств ходов от каждого элемента до
вычисленной в п. 2 координаты.
Выводим в качестве результата значения суммы ходов по вертикали и горизонтали для
каждого цвета отдельно.
Задача 24.
Ответом является количество различных размещений с повторениями из заданных
восьми координат. Подсчитываем число различных координат, их повторяемость в наборе,
для чего сортируем их. Полученные данные подставляем в формулу и получаем результат.
Задача 25.
Просматривая список емкостей, находим пары соединенных параллельно или
последовательно и заменяем пару конденсаторов - на один эквивалентный, с емкостью
- 39 -
рассчитанной по формулам из условия задачи. Процесс замен продолжаем до тех пор, пока
не останется один конденсатор, его емкость и выдаем в качестве ответа.
Задача 26.
Номера соседних кубиков из предыдущего и последующего слоев (если они есть),
отличаются от номера заданного кубика на квадрат длины ребра. Осталось промоделировать
размещение кубиков в слое и определить номера соседних с заданным. При первом проходе
определяем координаты заданного кубика в слое, при повторном проходе запоминаем
номера всех кубиков, координаты которых отличаются на единицу от координат заданного
кубика. Выводим все найденные номера.
Задача 27.
Количество различных возможных строк N! (число размещений без повторений из
N различных элементов по N), тогда число различных возможных значений таблицы равно
N! в степени N (число перестановок с повторениями из N! элементов на N позиций).
Чтобы подсчитать сколькими нолями заканчивается это число, нужно подсчитать сколькими
нолями заканчивается N! и полученный результат умножить на N .
Чтобы подсчитать
сколькими нолями заканчивается N! , достаточно подсчитать
сколько раз в разложенния на простые множители всех чисел от 1 до N входит
число 5 ( ноль на конце числа дают 2 и 5 в разложении на простые множители, но
двоек в разложениях всех чисел от 1 до N будет больше чем пятерок, значит, число
нолей на конце числа будет равно числу пятерок в разложении).
Для заданных в задаче ограничений для N< 1 000 000 000, мы не сможем подсчитать
число пятерок прямым перебором из-за ограничений по времени , и будем вычислять это
число исходя из следующих рассуждений: в разложения всех чисел от 1 до N в каждое
5-е число пятерка входит 1 раз , в каждое 25-е - 2 раза, 125-е - 3 раза и т. д. пока
степень пяти не станет больше N. Просуммировав все полученные таким
образом
целочисленные частные мы получим число пятерок во всех разложениях. При вычислении
окончательного результата ( при перемножении N и числа пятерок) применяем длинную
арифметику, т.к. его значение может выйти за границы типа longint.
Задача 28.
Очевидно, что для того чтобы показатель степени был максимальным, нужно чтобы
основания были наименьшими по абсолютной величине. Кроме этого, необходимо учитывать,
что согласно условию, основания – целые числа, значит, для нечетных показателей нужно
рассматривать варианты с отрицательными основаниями. Начиная проверку с наименьших
по абсолютной величине оснований единицы и минус единицы, постепенно их наращиваем
пока не получим результат, или не выйдем за пределы допустимых значений ( N<2).
Задача 29.
Последовательно проходя по всем звеньям ломаной проверяем не лежит ли оно на
одной из осей, если лежит то выводим ответ - !!!, иначе: смотрим пересекает ли звено ось
иксов, если да вычисляем координату точки пересечения, смотрим есть ли такая в нашем
списке и если нет - то заносим в список, то же повторяем для оси игреков. Решение
завершаем проверкой, если в обоих списках содержится ноль, то из одного из списков его
исключаем,
подсчитываем количество элементов в двух списках, которое и выдаем в
качестве результата.
Задача 30.
Для решения используем понятие инварианта. Решение осуществляется сокращением
заданных количеств предметов по модулю два, а затем, просчета различных вариантов на
минимальных остатках, которые возможны, и выдачи полученных результатов.
Задача 31.
- 40 -
Для того чтобы количество множителей было максимальным, нужно чтобы сами
множители были по возможности наименьшими по абсолютной величине. Кроме этого,
необходимо учитывать, что согласно условию, заданное число – целое, значит, может быть
отрицательным. Рассматривать положительные и отрицательные числа нужно отдельно. Для
этого запоминаем знак числа, берем число по абсолютной величине, для отрицательных
рассматриваем только нечетные показатели (количества множителей), для положительных все показатели, начиная проверку с наименьшего основания: двойки, постепенно его
наращиваем пока не получим ответ.
Задача 32.
Для решения используем таблицу, в которой отмечаем все возможные веса, которые
можно взвесить, заполняем таблицу по методу динамического программирования. Решение
осложняется тем, что гири можно ставить на обе чашки весов, и что одну и ту же гирьку
одновременно не поставишь на обе чашки одновременно. Проходя по всем гирькам для
каждой: просматриваем таблицу, где уже отмечены единицами, достигнутые веса, и для
каждой единицы отмечаем двойкой, еще не отмеченные ранее веса, которые из этой
единицы можно получить прибавлением или вычитанием веса текущей гирьки, повторно
просматривая таблицу, заменяем двойки единицами. Если после прохождения по всем
гирькам в таблице отмечен единицей элемент, индекс которого равен заданному весу, то
выдаем в качестве результата ответ - ДА, иначе - НЕТ.
Задача 33.
Количество прямоугольников, которые будут пересечены более, чем в одной точке,
не зависит от размеров прямоугольников, а зависит только от количества прямоугольников
в рядах по – горизонтали и по – вертикали, и вычисляется для одной диагонали по формуле
А+В-НОД(А,В) . Чтобы решить задачу
для
двух диагоналей: от удвоенного числа,
вычисленного для одной диагонали, надо вычесть количество прямоугольников пересеченных
одновременно двумя диагоналями, это количество зависит от четности – нечетности чисел А
и В ( если, например, А и В – четные, то количество прямоугольников, пересеченных двумя
диагоналями равно нолю). Рассматривая различные случаи четности – нечетности чисел А и
В получаем формулы для вычисления ответа.
Задача 34.
Количество различных цифровых комбинаций, удовлетворяющих требованию условия
«дважды счастливых», зависит от величины суммы цифр их составляющих. Для номеров из
четырех цифр различные такие суммы могут быть от 0 до 36 (9*4), причем они могут
быть только четными. Заводим таблицу счетчиков количеств различных номеров для всех
таких сумм. Полным перебором вариантов заполняем таблицу. Затем, перебирая все буквы
алфавита, находим ту, для которой в сочетании с введенной буквой наибольшее количество
«дважды счастливых» номеров, предусмотрев при этом, что если буквы в серии различные,
то номеров в два раза больше, чем для серии с совпадающими буквами потому, что
различные буквы серии можно поменять местами и получить новую серию. Выдаем,
найденную букву в качестве ответа.
Задача 35.
Моделируем процесс выбрасывания U ящиков если счет начинается с первого ящика,
запоминая при этом (перемещая в конец массива) номера выбрасываемых ящиков в
начальной расстановке, затем, для всех сдвигов по кругу начала отсчета соответственно
изменяем номера выбрасываемых ящиков и подсчитываем - сколько среди выброшенных
принадлежало F – тому купцу, ищем, для какого сдвига, число выброшенных ящиков этого
купца - минимально, запоминая при этом значение минимума и начала отсчета минимуму
соответствующего. Наименьший начальный номер отсчета получаем за счет поиска первого
минимума при просмотре от меньших к большим номерам.
- 41 -
Задача 36.
В решении необходимо предусмотреть различные случаи некорректности входных
данных, а именно:
11<N<2001, номер первой и последней выпавших страниц должны
иметь различную четность, количество выпавших страниц всегда четно, номер первой
выпавшей страницы меньше номера последней и т.д. При выполнении всех требований
корректности, путем полного перебора находим и выдаем в качестве ответа максимальное
возможное число выпавших страниц, иначе выдаем ответ: ноль.
Задача 37.
Для решения используем функции перевода чисел из десятичной в двоичную и
обратно, с учетом знака и дробности числа. Решение осуществляется переводом
коэффициентов в десятичную систему, нахождением корня и переводом его в двоичную
систему счисления, его и выдаем в качестве результата.
Задача 38.
Для всех треугольников вычисляем углы, учитывая их повторяемость в треугольнике
и занося в таблицу различных углов всех треугольников (т.е. если все углы треугольника
равны - то в таблицу заносится один угол, если все разные - то три угла, если есть два
одинаковых угла, то в таблицу они заносятся как один угол), далее таблица сортируется и
находится в ней наибольшее количество одинаковых ( т.к. вычисления идут с вещественным
типом, то одинаковыми считаются те, разность между которыми не превышает заданной
константы-погрешности) элементов, это и есть ответ.
Задача 39.
Для всех символов входящего слова делаем: берем по порядку символ и ищем его
первое вхождение во втором слове, далее следующий символ ищем уже начиная со
следующей позиции во втором слове, где был обнаружен предыдущий символ и т.д. пока не
закончится одно из слов. Если раньше закончилось первое слово то ответ ДА, если второе НЕТ. Записываем второе слово в обратном порядке и применяем к нему вышеописанный
алгоритм еще раз. Полученные ответы выдаем в качестве результатов.
Задача 40.
Для решения в первую очередь контролируем корректность входных данных. Решение
осуществляется вычислением вначале доли содержания нового компонента в сплаве как
отношение разности новой и старой цен к разности цены нового компонента и цены старого
сплава, и, затем, пересчета новых процентов, как произведения старых на оставшуюся долю
старого сплава в новом (единица минус доля нового компонента), которые и выдаем в
качестве результатов.
Задача 41.
По математической теории магических квадратов рассматриваются три вида:
1) с нечетной размерностью, 2) с четной размерностью кратной четырем, 3) с четной
размерностью некратной четырем. Решение в каждом случае осуществляется расстановкой
или перестановкой чисел в исходном квадрате по определенному правилу. Размерность
максимально возможного квадрата определяется из ограничений и возможностей среды
программирования. В качестве примера рассмотрим первый случай. Числа расставляются по
диагонали по порядку, начиная со средней клетки по вертикали и следующей за средней
клеткой по горизонтали. При расстановке горизонтальные и вертикальные стороны квадрата
попарно отождествляются, т. е. при выходе координаты за пределы квадрата, далее она
начинается сначала (клетка с N+1 координатой отождествляется с клеткой с координатой 1
). При заполнении диагонали (N клеток), дальнейшее заполнение продолжается с клетки с
горизонтальной координатой на два большей последней заполненной клетки, вертикальная
координата не изменяется. Заполненный таким образом квадрат будет решением для
нечетных размерностей.
- 42 -
Задача 42.
Для решения необходимо аккуратно перебрать и осуществить сочетания различных
возможных ситуаций по всем возможным вариантам для двух различных типов времени,
которые и выдаем в качестве результатов.
Задача 43.
Решение осуществляется моделированием процесса сражения Ивана со Змеем и
подсчета при этом количеств ударов и отрубленных голов, которые и выдаем в качестве
результатов.
Задача 44.
Умножаем все заданные емкости кружек на миллион, преобразуем в целочисленый
тип, находим НОД для всех семи полученных чисел, делим его на миллион и выдаем в
качестве ответа.
Задача 45.
Для решения используем функции подсчета количества дней в месяце и проверки
високостности года. Решение осуществляется моделированием полного перебора дней между
заданными датами и подсчета при этом количеств интересующих нас дней, которые и
выдаем в качестве результатов.
Задача 46.
Задача решается геометрическим моделированием: располагаем треугольник на
координатной плоскости так - большей стороной на оси OY , одной из вершин в начале
координат, вычисляем координаты его вершин, из них находим уравнения прямых на
которых лежат две остальные стороны треугольника, далее ищем значение координаты Х, в
которой абсолютное значение разности Y координат для двух прямых для сторон
треугольника равна самому Х. Найденное Х и есть длина стороны вписанного квадрата, в
качестве ответа выдаем учетверенное Х .
Задача 47.
Согласно условию, может быть не более 80*26=2040 различных контрольных сумм,
заведем логическую таблицу на такое число элементов. Читаем текст посимвольно, пока нет
пробела, подсчитываем контрольную сумму слова, при пробеле отмечаем в таблице сумму
(устанавливаем ИСТИНУ в элементе с индексом равным сумме) и начинаем считать
контрольную сумму следующего слова начиная с нуля. По прочтении текста, отмечаем
последнюю сумму, и подсчитываем ответ: количество ИСТИН в таблице.
Задача 48.
Проходим по большему слову (большее в меньшее входить не может) и ищем
вхождение в него меньшего, найдя вхождение увеличиваем на единицу счетчик и удаляем
меньшее слово из большего, продолжаем так до конца большого слова. Ответ – значение
счетчика.
Задача 49.
Читая сведения, о цветах лампочек в гирлянде, если цвет предыдущей и текущей
совпадают, то увеличиваем счетчик на единицу, иначе, проверяем: не является ли показание
счетчика максимумом, если да - то запомним его значение и обнуляем счетчик. Закончив
чтение, выдаем в качестве ответа максимальное из: текущего значения счетчика
и
сохраненного значения максимума.
Задача 50.
- 43 -
Согласно условию, Х очков набрано в N-1 игре, значит, если Х не превосходит N-1, то
ответ - Х ничьих, иначе были победы, за которые начислялось по 3 очка, моделируем
обратный процесс: снимаем с суммы очков по 3 очка, а с количества игр по одной игре (в
которой были набраны эти 3 очка), продолжаем пока количество игр меньше числа очков, и
количества игр и очков положительны, если при окончании цикла получили отрицательное
количество игр или очков или положительное число очков при нуле игр, то данные не
корректны, иначе максимальное число ничьих равно остаточному после цикла числу очков.
Задача 51.
Это геометрическая задача нахождения координат точки равноудаленной от трех
заданных точек решается так: проверяется принадлежность заданных точек одной прямой,
если принадлежат, то решений нет, иначе строятся серединные перпендикуляры к двум
парам заданных точек (определяются коэффициенты прямых, являющихся серединными
перпендикулярами), находятся координаты точки их пересечения, которые выдаются в
качестве ответа, при этом, отдельно рассматриваются случаи равенства одной из координат
у пары точек, чтобы избежать деления на ноль.
Задача 52.
Согласно формализованной математической модели, в задаче, требуется найти
наименьшее общее кратное для чисел от 2 до N. Согласно ограничениям задачи, искать его
требуется с применением длинной арифметики, поиск НОК и НОД в которой сложны в
реализации, поэтому предлагается следующий способ поиска НОК: перебираются все
простые числа Р не превосходящие N , начиная с двух, и каждое из них берется в НОК в
наибольшей степени М такой, чтобы выполнялось неравенство: P ^M <=N. Нахождение НОК
описанным способом позволяет обойтись только длинным умножением, найденное НОК –
длинное число, выдать в качестве результата.
Задача 53.
Ярмарку нужно проводить в населенных пунктах или пункте, где живут (при
четном количестве участников) участники, которым соответствуют середние по порядку
номера участников, для нечетного количества участников - такой, средний, участник один,
а, значит, и пункт проведения тоже один. Подсчитываем общее количество участников
ярмарки, ищем пункт (пункты), где живет (живут) средний (средние) участник (участники) и
выдаем пункт (все пункты от пункта проживания первого среднего до пункта проживания
второго среднего участников) в качестве товета.
Задача 54.
Создаем функцию расчета расхода краски на печатание заданного номера – аргумента.
Читаем исходные данные. Подсчитываем расход краски для печатания серии из К номеров,
начиная с первого номера интервала, затем, проходя по всем номерам интервала, начиная со
второго, преобразуем значение расхода краски на серию, вычитая значение функции для
предыдущего начальному номера серии и прибавляя значение функции последнего номера
серии, параллельно этому просмотру, ведем поиск текущего максимального значения
расхода краски на серию, запоминая соответствующий ему начальный номер, который
выдаем в качестве результата по окончании просмотра.
Задача 55.
Моделируем процесс изменения численности саранчи, ставя блок уменьшения раньше
блока увеличения, контролируя при этом моменты истечения полных суток и делимость на
11 численности саранчи в эти моменты. Учитывая ограничения задачи, все действия
производим в длинной арифметике.
Задача 56.
- 44 -
Создаем таблицу, где в десятичном виде сохраняем цену акра в княжестве с системой
счисления равной индексу элемента. Находим для всех княжеств сумму элементов таблицы,
вычитаем из неё сумму получившуюся у визиря, еще раз просматривая таблицу, выдаём в
качестве результатов индексы тех элементов, значения которых равны найденной разности
сумм.
Задача 57.
Заведем и заполним таблицу сумм расстояний от данного объекта до остальных, найдем
в ней минимум и выдадим в качестве результата координаты объекта, которому
соответствует найденный минимум.
Задача 58.
Запишем множества дней и номеров месяцев, которые выражаются простыми числами,
опишем функции проверки простоты числа, проверки високосности года, количества дней в
месяце и количества дней между заданными датами. Методом моделирования, начиная от
начальной даты, для простых чисел – годов, генерируем по порядку все простые даты в
пределах заданной продолжительности события и считаем, те, между которыми простое
число дней не большее предельной продолжительности события, продолжаем так до
конечной даты, после достижения которой, выводим в качестве результата значение счетчика.
Задача 59.
Заведем логическую таблицу на количество всех участников парада, в которой отметим
самого участника и будем отмечать номера (соответствующие индексам таблицы) участников,
которые будут при очередном варианте перестроения оказываться соседями заданного
участника. Новые варианты перестроений будут получаться при нахождении каждого нового
делителя для числа участников, причем, надо заметить, что перестановка сомножителей (если
только они не равны между собой) будет давать, по условиям нашей задачи, новый вариант
перестроения потому, что при этом будут изменяться номера соседей заданного участника.
Кроме этого, надо учесть, что для каждого делителя существуют два различных варианта
перестроения: первый - когда все шеренги начинаются с одной и той же стороны, т.е.
«разрывается» непрерывная цепь участников и новая шеренга начинается с той же стороны,
что и предыдущая, при втором варианте цепь не разрывается, при завершении шеренги новая начинается здесь же и строится в обратном направлении («змейкой»). Номера соседей
из предыдущей и последующей шеренг (если они есть), отличаются от номера заданного
участника при первом варианте перестроения
на величину делителя. Осталось
промоделировать размещение соседей при втором варианте перестроения и отметить их
номера в таблице. В цикле определяем все делители числа участников и для двух вариантов
перестроения для каждого делителя отмечаем в таблице номера соседей. Подсчитываем в
таблице количество не отмеченных элементов и выводим его в качестве ответа.
Задача 60.
Число иероглифов будет равно числу различных не пустых подграфов графа – шаблона.
Число различных подграфов графа равно двум в степени К, где К - число различных ребер
графа, исключив из числа всех различных подграфов пустой подграф, получим ответ
задачи. Задача свелась к подсчету числа различных ребер графа, заданного матрицей
смежности вершин. Учитывая то, что граф не ориентированный и не мультиграф, матрица
будет симметричной и достаточно подсчитать количество единиц над ее главной
диагональю и на ней (там могут быть единицы так как в качестве графа допустим
псевдограф), это и будет число К. Исходя из числа вершин до 100 и допустимости
псевдографа, максимальное число ребер будет: К*(К-1)/ 2 + К = (К^2 + К)/ 2 = (100*100+100)/
2 = 5050.
Понятно, что для нахождения двух в такой степени понадобится длинная арифметика,
реализуем её, находим число 2^К и уменьшив на единицу младший разряд полученного
- 45 -
длинного числа (это можно сделать и без длинной арифметики, так как никакая степень
двойки не заканчивается нолём), выводим длинное число в качестве результата.
Задача 61.
Читаем строку – ребус, удаляем из нее пробелы, заменяем все малые буквы на
соответствующие им большие, запоминаем вид ребуса: равно раньше плюса или наоборот.
Подсчитываем количество различных букв в ребусе, если оно больше 10, то решений - нет,
иначе выделяем из ребуса слова: сумму и два слагаемых, анализируем их: если одно из
слагаемых длиннее суммы или сумма длиннее большего из слагаемых больше чем на
единицу, то решений нет, иначе организуем поиск решений. Поиск решений ведем путем
перебора всех сочетаний из 10 цифр по количеству различных букв в ребусе. Для каждого
сочетания организуем перебор всех его перестановок, каждую из которых проверяем на
соответствие решению ребуса, исключая при этом те решения, где в многозначных числах
вначале стоит ноль. При нахождении решений ребуса выводим их.
Задача 62.
Для ускорения проверки простоты числа заполняем таблицу простых чисел не
превосходящих корня из заданного числа плюс единица, описываем логическую функцию
проверки простоты числа, создаем рекурсивную функцию нахождения максимального
простого из заданного в виде строки числа, которая работает по принципу: преобразуется
строка к виду, который должна иметь строка - простое число (оно должно заканчиваться на
1,3, 7 или 9, если в нем более одного разряда, иначе должно быть большим из встречающихся в
заданном числе цифр: 2,3,5,7), затем, если оставшаяся строка имеет длину больше одного –
перевести её в числовой вид и проверить на простоту, если простое - то оно ответ, если не
простое - удаляем поочередно из строки по одному символу и обращаясь к рекурсивной
функции с новым параметром ищем ответ как максимум из серии этих обращений.
Задача 63.
Описываем функцию перевода римского числа, заданного в виде строки, в арабское и
обратную функцию. Читаем коэффициенты уравнения в римской форме записи, переводим в
арабскую, решаем уравнение, если есть натуральные решения - переводим их в римскую
форму записи и выдаем в виде ответа, иначе выдаем сообщение: натуральных решений нет.
Задача 64.
Количество пластинок, которые будут засвечены более, чем в одной точке, не
зависит от размеров пластинки, а зависит только от количества пластинок в рядах по –
горизонтали и по – вертикали, и вычисляется по формуле А+В-НОД(А,В). Чтобы решать
задачу для больших исходных значений, модифицирован алгоритм поиска НОД.
Задача 65.
Описываем функцию поиска количества гласных в наименовании трехзначного числа
к-го разряда, заметим, что в самом числе количество гласных не изменяется, а изменяется
только в наименованиях разрядов (тысяч, миллионов, миллиарда). Читаем число, в цикле
разлагаем его на поразрядные трёх цифровые составляющие, получаем результат как сумму
значений функции от этих составляющих.
Задача 66.
Генерируем все перестановки заданной четверки цифр, просматривая при этом все
возможные варианты (схемы) степеней для каждой перестановки, запоминая при этом
перестановку и схему соответствующие максимальному числу. При этом у нас возникает
две проблемы. Первая - обработка чисел, которые могут быть очень велики ( например:
9^9^9^9 ), эта проблема легко решается двойным логарифмированием результата, но
последнее порождает вторую проблему - логарифмирование отрицательных чисел и нулей,
для решения которой описываем пользовательскую функцию логарифма по основанию
- 46 -
меньшему двух ( например: 1.8), которую доопределяем при аргументах меньших или равных
нулю отрицательным значением, большим по модулю наибольшего возможного значения
для различных вариантов схем.
Задача 67.
Для окончательного результата стрельбы необходимо узнать количество промахов К1
и количество попаданий К2, сделанные стрелком, тогда окончательный ответ будет
вычисляться по комбинаторной формуле числа размещений с повторениями, которая для
нашей задачи будет иметь вид:
(К1+К2)! / ( К1!* К2!). Очевидно, что при промахе,
имеющаяся у стрелка сумма умножается на (1-Р/100), а при попадании она умножается на
(1+Р/100), пришли к уравнению: Х* (1-Р/100)^K1 * (1+P/100)^K2 = X1, решать которое
будем так: заведем две таблицы одну для промахов M1 и одну для попаданий M2, в
которых М1(2)[i]= (1-(+) P/100)^ i ; затем, просматривая от 1 до 20 двойным вложенным
циклом находим значения К1 и К2, такие что минимальна по абсолютной величине разность:
Х1/Х- М1[K1]* M2[K2], при условии что К1+К2<=20. Осталось, чтобы избежать длинной
арифметики, заполнить динамически таблицу К1 на К2 значений комбинаторной функции
(приведенной вначале задачи) и выдать в качестве ответа ее элемент с индексами К1 и К2.
Задача 68.
Задача решается моделированием. Заводим массив на К элементов, считая что М-й
элемент массива сумма денег у игрока, проигравшего в М-й партии. Заполняем массив
значением остатка денег у каждого из игроков после игры и циклом из К повторений
моделируем процесс изменения сумм денег у игроков обратный процессу, который
происходил во время игры. Ответом, после завершения цикла, будет значение N-го
элемента массива.
Задача 69.
Ответ вычисляется по формуле:
Р=А+В+С–(НОД(А,В)+НОД(А,С)+НОД(В,С)-min(НОД(А,В),НОД(А,С),НОД(В,С) ) ).
Для того, чтобы алгоритм работал с числами порядка 10^9 нужно использовать быстрый
алгоритм вычисления НОД.
Задача 70.
Решениями задачи
являются последовательные пары чисел из классического
(начинающегося двумя единицами ) ряда чисел Фибоначчи. Легко заметить, что для
заданного количества различных квадратов N, решениями будут N+1 и N+2 члены ряда.
Остается заметить, что для вычисления членов ряда с номерами большими 45 потребуется
реализация длинной арифметики.
- 47 -
Глава 4. Листинги решений на PASCAL.
Program Zadaha01;
Var i,j,k:word; NSI,NSU,SS,S1,S2,BB,MB,BRK,MRK:string;
Function Chifr(X:string):string;
Begin S2:='';
for i:=1 to length(X) do begin
k:=2*Pos(X[i],BB)+2*Pos(X[i],MB);
if k>33 then k:=k-33;
if Pos(X[i],BB)<>0 then S1:=BB[k];
if Pos(X[i],MB)<>0 then S1:=MB[k];
S2:=S2+S1; end;
Chifr:=S2;
end;
Begin
BB:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ'; BRK:=Chifr(BB);
MB:='абвгдеёжзийклмнопрстуфхцчшщьыъэюя'; MRK:=Chifr(MB);
Readln(SS); S2:='';
for i:=1 to length(SS) do begin S1:=SS[i];
if Pos(SS[i],BB)<>0 then S1:=BB[(Pos(SS[i],BRK))];
if Pos(SS[i],MB)<>0 then S1:=MB[(Pos(SS[i],MRK))];
S2:=S2+S1; end;
Writeln(S2);
end.
Program Zadaha02;
Var D: array [1..2] of longint;
i,T,p,a,b,c,w:longint; SS:string[2];
Begin
readln(SS);
for i:=1 to 2 do case SS[i] of
'I': D[i]:=1;
'V': D[i]:=5;
'X': D[i]:=10;
'L': D[i]:=50;
'C': D[i]:=100;
'D': D[i]:=500;
'M': D[i]:=1000;
else D[i]:=0;
end;
p:=0;T:=0; if (D[1]*D[2]>0) then begin if (D[1]>=D[2]) then
begin if (SS='VV')or(SS='LL')or(SS='DD') then p:=1 else C:=D[1]+D[2];end
else if (SS='IV')or(SS='IX')or(SS='XL')or(SS='XC')or(SS='CD')or(SS='CM')
then C:=D[2]-D[1] else p:=1; if p=0 then
for a:=0 to 99 do for b:=0 to 99 do for w:=0 to 3 do
case w of
0: if a+b=C then inc(T);
1: if a-b=C then inc(T);
2: if a*b=C then inc(T);
3: if a*100+b=C then inc(T);
end;
- 48 -
end;
Writeln(T);
end.
PROGRAM Zadaha03;
const z=28;
type DH=array[1..z] of longint;
var i,j,N:integer; SL1,SL2:DH;
PROCEDURE SUM(MD1,MD2:DH; var RMU:DH);
Var mi:byte;Per:longint;
begin Per:=0;for mi:=1 to z do begin
RMU[mi]:=(MD1[mi]+MD2[mi]+Per) mod 1000000000;
Per:=(MD1[mi]+MD2[mi]+Per) div 1000000000;
end;end;
PROCEDURE ZERO(var VV:DH);
Var m1:byte;
begin for m1:=1 to z do VV[m1]:=0;end;
PROCEDURE WYWOD(var WV:DH);
Var ii:integer;SH:string;
Begin
ii:=z; While (WV[ii]=0)and(ii>0) do Dec(ii);
if ii=0 then writeln(0) else begin
write(WV[ii]);Dec(ii);
While ii>0 do begin
if WV[ii]>=100000000 then write(WV[ii]:9) else
begin Str(WV[ii],SH); While length(SH)<9 do SH:='0'+SH;
write(SH:9);end;
Dec(ii);end;
writeln;
end;
end;
BEGIN
readln(N);
if N=1 then Writeln(3) else begin
ZERO(SL1); ZERO(SL2); SL1[1]:=1; SL2[1]:=1;
if N mod 2 = 0 then
BEGIN for i:=1 to N div 2 do SUM(SL1,SL1,SL1);
SUM(SL1,SL2,SL2); END else begin
for i:=1 to (N-3) div 2 do SUM(SL1,SL1,SL1); SUM(SL1,SL2,SL2);
for i:=((N-3) div 2)+1 to (N-1) div 2 do SUM(SL1,SL1,SL1);
SUM(SL1,SL2,SL2); end;
for i:=(N div 2)+1 to N-1 do SUM(SL1,SL1,SL1); SUM(SL1,SL2,SL2);
WYWOD(SL2);
end;
end.
program Zadaha04;
var
bim,bom,bum:real;
K:Boolean;
- 49 -
begin
readln(bim,bom,bum);
K:=(bim=bom)AND(bom=bum);
if K then writeln('NO');
K:=((bim<bom)AND(bim>bum))or((bim>bom)AND(bim<bum))or((bum=bom)AND(bim<bum));
if K then writeln('BIM');
K:=((bom<bim)AND(bom>bum))or((bom>bim)AND(bom<bum))or((bum=bim)AND(bom<bum));
if K then writeln('BOM');
K:=((bum<bim)AND(bum>bom))or((bum>bim)AND(bum<bom))or((bom=bim)AND(bum<bom));
if K then writeln('BUM');
K:=(bom=bim)AND(bum>bom);
if K then writeln('BIM BOM');
K:=(bom=bum)AND(bim>bom);
if K then writeln('BOM BUM');
K:=(bim=bum)AND(bom>bim);
if K then writeln('BIM BUM');
end.
program Zadaha05;
var
i,M:word; t:ARRAY[1..7] of word;
begin
for i:=1 to 7 do read(t[i]);readln;
M:=t[1];
for i:=1 to 7 do
if t[i]<M then M:=t[i];
for i:=1 to 7 do
if t[i]=M then write(i:2);
writeln;
end.
program Zadaha06;
var
x,y,p:real; t:word;
begin
readln(x,y,p); t:=0;
if (x<y)or(x<=0)or(y<=0) then writeln('NO') else
begin
while x>y do begin
x:=x/(1+p/100); t:=t+1;
end;
writeln(t:4);
end;
end.
program Zadaha07;
var C1,C2,C,Z1,Z2,Z,M1,M2:longint;
Function NOD(A,B:longint):longint;
begin
IF (A=0) or (B=0) then NOD:=1 else
begin
While A<>B do
if A>B then A:=A-B else B:=B-A;
NOD:=A;
- 50 -
end;
end;
begin
READLN(C1,Z1,C2,Z2);
M1:=Z2 div (NOD(Z1,Z2));
M2:=Z1 div (NOD(Z1,Z2));
C:=abs(C1*M1-C2*M2);
Z:=M1*Z1;
Writeln(C div (NOD(C,Z)):6, Z div (NOD(C,Z)):6);
end.
program Zadaha08;
var X1,X2,Y1,Y2,K,D:real;Z,X,Y:longint;
Function KROT(B:longint):longint;
Var A,S:longint;
begin IF (B<2) then KROT:=0 else begin A:=1; S:=0;
While A<>B do begin S:=S+B-A;A:=A+1;end;
KROT:=S;
end; end;
Function ZMIN(U,W:REAL):REAL;
begin ZMIN:=U; IF (W<U) then ZMIN:=W ;
end;
Function ZMAX(U,W:REAL):REAL;
begin ZMAX:=U; IF (W>U) then ZMAX:=W
;end;
begin Z:=0; READLN(X1,Y1,X2,Y2);
IF X1<>X2 THEN BEGIN K:=(Y1-Y2)/(X1-X2); D:=Y2-K*X2;
FOR X:=TRUNC(ZMIN(X1,X2)) TO TRUNC(ZMAX(X1,X2)) DO
IF K*X+D=INT(K*X+D) THEN Z:=Z+1; END
ELSE IF X1=INT(X1) THEN
FOR Y:=TRUNC(ZMIN(Y1,Y2)) TO TRUNC(ZMAX(Y1,Y2)) DO
IF Y/1=INT(Y) THEN Z:=Z+1;
Writeln(KROT(Z));
end.
program Zadaha09;
Type LoNum=string;
Var X1,X2,N,i,k:word;
S1,S2,SC,SZ:LoNum;
Function MaxLo(d,e:LoNum):word;
begin
if length(d)>length(e) then MaxLo:=length(d)
else MaxLo:=length(e);
end;
Function PRC(dd:word):LoNum;
Var yy,ll:string;
begin yy:='';
While dd>0 do begin
str(( dd mod 10),ll);
yy:=yy+ll; dd:=dd div 10; end;PRC:=yy;
end;
procedure SUMMY(A,B:LoNum;Var C:LoNum;Var U:word);
var tt,w,v,h,q:word;ss:string;
begin C:='';h:=0;U:=0;
- 51 -
for tt:=1 to MaxLo(A,B) do begin w:=0; v:=0;
if tt<=length(A) then Val(A[tt],w,q);
if tt<=length(B) then Val(B[tt],v,q);
Str(((v+w+h) mod 10),ss);C:=C+ss;
U:=U+((v+w+h) mod 10);
h:=(w+v+h) div 10; end; U:=U+h;
if h<>0 then begin Str(h,ss);C:=C+ss;end;
end;
BEGIN
readln(X1,X2,N); S1:=PRC(X1); S2:=PRC(X2);
for i:=3 to N do begin SUMMY(S1,S2,SZ,k);
SC:=PRC(k); SUMMY(SC,SZ,SZ,k);
S1:=S2; S2:=SZ;
end;
For i:=Length(SZ) downto 1 do write(SZ[i]:1);
writeln;
end.
PROGRAM Zadaha10;
CONST NM=100;
VAR X,Y,N,M,i,j,k,z:integer;
T:array[-1..NM+2,-1..NM+2] of integer;
Procedure HAG(kk:integer);
Var ii,jj:integer;
Begin
for ii:=1 to N do
for jj:=1 to N do
if T[ii,jj]=kk then begin
T[ii-2,jj-1]:=kk+1;T[ii-2,jj+1]:=kk+1;
T[ii+2,jj-1]:=kk+1;T[ii+2,jj+1]:=kk+1;
T[ii-1,jj-2]:=kk+1;T[ii-1,jj+2]:=kk+1;
T[ii+1,jj-2]:=kk+1;T[ii+1,jj+2]:=kk+1;
end ;
End;
BEGIN readln(N,X,Y,M);
for i:=-1 to N+2 do for j:=-1 to N+2 do T[i,j]:=0;
k:=0; z:=0; T[X,Y]:=1;
While k<M do begin inc(k); HAG(k); end;
for i:=1 to N do for j:=1 to N do if T[i,j]=0 then inc(z);
WRITELN(z);
END.
PROGRAM Zadaha11;
{$R+}
VAR PR:boolean;
CF,VG,A,B,X:integer;
CH,Sd,f:longint;
Function ZC(G:longint;OS:word):boolean;
Var z,k:word;q:longint;
S:array[0..99] of boolean;
Begin z:=0; ZC:=FALSE; q:=G;
for k:=0 to OS-1 do S[k]:=FALSE;
- 52 -
While q>=OS do begin
S[(q mod OS)]:=TRUE;
q:=q div OS; end;
S[q]:=TRUE;
for k:=0 to OS-1 do if S[k] then z:=z+1;
if G mod z = 0 then ZC:=TRUE;
End;
Procedure NACH;
Begin A:=1;B:=1;CF:=(CH div Sd) mod 10;VG:=9-CF;
End;
BEGIN
READLN(CH,X);
Sd:=1;PR:=FALSE; NACH;
WHILE (NOT(PR))AND(CH>=Sd) DO BegiN
IF A<=CF THEN Begin
f:=10*Sd*(CH div (Sd*10))+(CF-A)*Sd+CH mod Sd;
if ZC(f,X) then PR:=TRUE else A:=A+1;
End;
IF (B<=VG)AND(NOT(PR)) THEN Begin
f:=10*Sd*(CH div (Sd*10))+(CF+B)*Sd+CH mod Sd;
if ZC(f,X) then PR:=TRUE else B:=B+1;
End;
IF (A>CF)AND(B>VG) THEN Begin
SD:=Sd*10 ; NACH ; End; EnD;
IF PR THEN WRITELN(f:10) ELSE WRITELN('NO');
END.
PROGRAM Zadaha12;
VAR S,K,a,b,c,N,M,Z,X,Y,U:LONGINT;
FUNCTION KOR(d,e1,w:longint):longint;
VAR e,jj:longint;
begin jj:=0;e:=e1;
if e1>w-e1+1 then e:=w-e1+1;
if d>e then jj:=d-e;
if d>w-e+1 then jj:=jj+d-w+e-1;
KOR:=jj;
end;
BEGIN
readln(M,N,Z);
readln(X,Y,U); S:=0;
if M>N then K:=N else K:=M;
if K>Z then K:=Z;
for a:=1 to M do begin if a<=K then
S:=S-(M-a+1)*(N-a+1)*(Z-a+1)+(a-KOR(a,X,M))*(a-KOR(a,Y,N))*(a-KOR(a,U,Z));
for b:=1 to N do for c:=1 to Z do
S:=S-(a-KOR(a,X,M))*(b-KOR(b,Y,N))*(c-KOR(c,U,Z))+(M-a+1)*(N-b+1)*(Z-c+1);
end;
WRITELN(S:11);
END.
PROGRAM Zadaha13;
CONST NM=100;
VAR X,Y,X1,Y1,N,K,M,i,j,z,k1:integer;
T:array[-1..NM+2,-1..NM+2] of integer;
Procedure HAG(kk:integer);
- 53 -
Var ii,jj:integer;
Begin M:=0;
for ii:=1 to N do for jj:=1 to N do
if T[ii,jj]=0 then inc(M);
for ii:=1 to N do
for jj:=1 to N do
if T[ii,jj]=kk then begin
if T[ii-2,jj-1]>=0 then T[ii-2,jj-1]:=kk+1;
if T[ii-2,jj+1]>=0 then T[ii-2,jj+1]:=kk+1;
if T[ii+2,jj-1]>=0 then T[ii+2,jj-1]:=kk+1;
if T[ii+2,jj+1]>=0 then T[ii+2,jj+1]:=kk+1;
if T[ii-1,jj-2]>=0 then T[ii-1,jj-2]:=kk+1;
if T[ii-1,jj+2]>=0 then T[ii-1,jj+2]:=kk+1;
if T[ii+1,jj-2]>=0 then T[ii+1,jj-2]:=kk+1;
if T[ii+1,jj+2]>=0 then T[ii+1,jj+2]:=kk+1;
end ;
for ii:=1 to N do for jj:=1 to N do
if T[ii,jj]=0 then Dec(M);
End;
BEGIN readln(N,X1,Y1,X,Y,K);
for i:=-1 to N+2 do for j:=-1 to N+2 do T[i,j]:=0;
for i:=1 to K do begin Readln(j,z);
T[j,z]:=-2;end; HAG(-2);
if (X<>X1)or(Y<>Y1)or(T[X1,Y1]=0) then T[X1,Y1]:=1;
if T[X,Y]<0 then Writeln('NO') else begin k1:=0; M:=1;
While (T[X,Y]=0)and(M<>0) do begin inc(k1); HAG(k1); end;
if T[X,Y]=0 then Writeln('NO') else WRITELN(T[X,Y]-1); end;
END.
Program Zadaha14;
const nm=100;
VAR M:array[1..nm] of byte;
i,j,k,q:word; SH,SM,BB,VB:string;
Function Wrhif(X:string):string;
Var ii:byte;S2:string;
Begin S2:='';
for ii:=1 to length(X) do
if Pos(X[ii],BB)<>0 then S2:=S2+VB[Pos(X[ii],BB)];
Wrhif:=S2;
end;
Procedure UMN(K3:byte);
Var ii,pr,pr1:byte;
begin pr:=0;
for ii:=1 to j do begin pr1:=(K3*M[ii]+pr) div 10;
M[ii]:=(K3*M[ii]+pr) mod 10; pr:=pr1; end;
if pr>0 then begin M[j+1]:=pr; inc(j);end;
end;
Begin
BB:='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯABCDEFGHQIJKLMNOPRSTU
VWXYZ';
VB:='44824424242444644884444422222222248844446242444448444442422';
Readln(SH); SM:=Wrhif(SH);
for i:=1 to nm do M[i]:=0; j:=1; M[j]:=1;
for i:=1 to length(SM) do begin
- 54 -
Val(SM[i],K,q); UMN(K); end;
for i:=j downto 1 do Write(M[i]:1); Writeln;
end.
PROGRAM Zadaha15;
VAR X,Y:real;Hi,Ni,Ki,j,PX,PY:longint;
Function RD(A,B:longint):boolean;
var ii:integer;PP:boolean; KK,DD:longint;
DT,DL:array[0..9] of boolean;
Begin PP:=False;
for ii:=0 to 9 do begin DL[ii]:=False;DT[ii]:=False; end;
if (abs(A)) mod (abs(B)) = 0 then begin
KK:=abs(A);DD:=abs(B); While KK>0 do begin
DL[KK mod 10]:=True;KK:=KK div 10; end;
While DD>0 do begin
DT[DD mod 10]:=True;DD:=DD div 10; end;
for ii:=0 to 9 do PP:=PP or ((DT[ii])and(DL[ii]));
RD:=not(PP); end else RD:=False;
End;
Function KRD(C:longint):longint;
var ss,cc,vg,ng:longint;
Begin cc:=abs(C);ss:=0;vg:=cc-1;ng:=1;
WHILE ((vg>ng)) and (ng<=sqrt(cc)) DO
if RD(cc,ng) then begin inc(ss); vg:=cc div ng ;
if (RD(cc,vg))and(ng<>vg) then inc(ss);
inc(ng); dec(vg); end else inc(ng);
KRD:=2*ss;
End;
BEGIN readln(X,Y); if X<Y then begin
if (frac(X)=0)or(X<=0) then PX:=0 else PX:=1;
if (frac(Y)=0)or(Y>=0) then PY:=0 else PY:=-1;
Ni:=PX+trunc(X); Ki:=PY+trunc(Y);end
else begin
if (frac(X)=0)or(X>=0) then PX:=0 else PX:=-1;
if (frac(Y)=0)or(Y<=0) then PY:=0 else PY:=1;
Ni:=PY+trunc(Y); Ki:=PX+trunc(X);end;
Hi:=Ni;
for j:=Ni to Ki do if (j<>0) and (KRD(j)>=KRD(Hi)) then Hi:=j;
WRITELN(Hi,' ',KRD(Hi));
END.
PROGRAM Zadaha16;
VAR K,G,B,T,i,j:byte; M:longint;
R,H:array[0..255] of longint;
BEGIN readln(M,K,G,B,T);R[0]:=M;H[0]:=M;
R[1]:=M*K; if R[1]>M*B then R[0]:=R[0]-round(R[0]/B);
H[1]:=R[0]+R[1];
for i:=2 to T do begin
R[i]:=(R[i-2]+R[i-1])*K;
H[i]:=R[i]+H[i-1];
if R[i]>M*B then begin
H[i]:=H[i]-round(R[i-1]/B);
R[i-1]:=R[i-1]-round(R[i-1]/B);end;
- 55 -
if i>=G then H[i]:=H[i]-R[i-G];
end;
WRITELN(H[T]);
END.
program Zadaha17;
Var i:byte;S,F:string; X:array[1..255] of byte;
BEGIN READLN(S); for i:=1 to length(S) do X[i]:=0;
for i:=1 to length(S) do inc(X[ord(S[i])]); i:=14;
while (X[i] mod 2 = 0) AND (255>i) do inc(i);
if 255>i then begin dec(X[i]); F:=chr(i); end else F:='';
for i:=255 downto 14 do
while (X[i]>1) do begin dec(X[i],2); F:=chr(i)+F+chr(i); end;
writeln (length(F)); writeln(F);
END.
Program Zadaha18;
{$M 65520,0,0}
Const MaxN=1000;
Type BasTypMas=array[1..2*MaxN] of string[11];
Var
MZ:BasTypMas;
N,S,k,SM:word;
Z:string;
Procedure BlicSort (mm,tt: Integer; Var A:BasTypMas);
{Рекурсивная процедура быстрой сортировки. Ее можно заменить
на сортировку любым другим способом.}
Var ii,jj: Integer;
xx,ww:string[11];
Begin
ii:=mm; jj:=tt; xx:=A[(mm+tt) Div 2];
Repeat
While A[ii]<xx Do Inc(ii);
While A[jj]>xx Do Dec(jj);
If ii<=jj Then Begin ww:=A[ii];
A[ii]:=A[jj]; A[jj]:=ww;
Inc(ii); Dec(jj) End
Until ii>jj;
If mm<jj Then BlicSort(mm,jj,A);
If ii<tt Then BlicSort(ii,tt,A);
End;
BEGIN
readln(N);
for k:=1 to N do begin readln(Z);
MZ[k]:=copy(Z,1,10)+'o';
MZ[k+N]:=copy(Z,12,10)+'z';
end;
BlicSort(1,2*N,MZ); S:=0;SM:=0;
for k:=1 to 2*N do begin
if MZ[k,11]='o' then inc(S) else dec(S);
if SM<S then SM:=S;
end;
writeln(SM);
END.
- 56 -
program Zadaha19;
var A,B,K:longint;
function HOD(x,y:longint):longint;
begin while x<>y do if x>y then x:=x-y else y:=y-x;
HOD:=x;
end;
BEGIN readln(A,B,K);
WRITELN(1+Trunc((exp(A*B*ln(K)/(A*B+A+B-HOD(A,B))))));
end.
PROGRAM Zadaha20;
Const Nmax=100;
VAR i,j,k,N,M,Z:byte;R,P:real;
D:ARRAY[1..Nmax,1..Nmax] of byte;
BEGIN
READLN(N,P,M,Z);
for i:=1 to N do begin for j:=1 to N do begin
READ(R);
IF R<=P then D[i,j]:=1 else D[i,j]:=2*N;end; readln; end;
for k:=1 to N do
for i:=1 to N do
for j:=1 to N do
IF D[i,j]>D[i,k]+D[k,j] then
D[i,j]:=D[i,k]+D[k,j];
if D[M,Z]<2*N then WRITELN(D[M,Z]) else WRITELN('NO');
END.
PROGRAM Zadaha21;
Type Dh=array[1..261] of WORD;
VAR F,R:Dh; N,i,j:word; BS:string;
Function SR(A,B:Dh):byte;
var ii,jj:integer;
Begin ii:=261;jj:=261;SR:=0;
WHILE (ii>0)and(A[ii]=0) DO dec(ii);
WHILE (jj>0)and(B[jj]=0) DO dec(jj);
if ii>jj then SR:=2 else if ii=jj then begin
WHILE (ii>0)and(A[ii]=B[ii]) DO dec(ii);
if ii=0 then SR:=1 else
if A[ii]>B[ii] then SR:=2;end;
End;
Function LG(C:Dh):word;
var kk:word;
Begin kk:=261;WHILE (kk>0)and(C[kk]=0) DO dec(kk);LG:=kk;
End;
BEGIN readln(BS); N:=0;R[1]:=1;
for i:=2 to 261 do begin R[i]:=0;F[i]:=0; end;
for i:=1 to length(BS) do F[i]:=ord(BS[length(BS)-i+1])-ord('0');
WHILE SR(F,R)>0 DO begin inc(N);
for i:=1 to LG(R) do R[i]:=R[i]*N;
for i:=1 to 260 do begin
R[i+1]:=R[i+1]+R[i] div 10;
R[i]:=R[i] mod 10; end;
- 57 -
end;
WRITELN(N-1);
END.
PROGRAM Zadaha22;
VAR N,Z,M,MM,R,i,v,w:longint;
Function BS(A:longint):boolean;
var S:integer;j,k:byte;
Begin k:=N div 2;S:=0;
for j:=1 to k do begin S:=S+ A mod 10; A:=A div 10; end;
if N mod 2 = 1 then A:=A div 10;
for j:=1 to k do begin S:=S- A mod 10; A:=A div 10; end;
if S=0 then BS:=true else BS:=False;
End;
BEGIN readln(N,Z);M:=0;R:=1;MM:=0;
for i:=1 to N do R:=R*10;dec(R);
if R>=Z then Begin
for i:=1 to Z do if BS(i) then inc(M);
for i:=Z+1 to R do begin
if BS(i) then inc(M);
if BS(i-Z) then dec(M);
if MM<M then MM:=M; end;
for i:=1 to Z-1 do begin
if BS(i) then inc(M);
if BS(R-Z+i) then dec(M);
if MM<M then MM:=M; end;
end else Begin
for v:=1 to Z do begin
if v mod R=0 then w:=R else w:=v mod R;
if BS(w) then inc(M);
if MM<M then MM:=M; end;
for i:=1 to R do begin
if (Z+i) mod R=0 then w:=R else w:=(Z+i) mod R;
if BS(w) then inc(M);
if BS(i) then dec(M);
if MM<M then MM:=M; end;end;
WRITELN(MM);
END.
Program Zadaha23;
{$M 65520,0,0}
Const MaxN=2000;
Type BasTypMas=array[1..MaxN] of byte;
Var XB,XH,XK,YB,YH,YK:BasTypMas;
X1,Y1,N,M,UB,UH,UK,k1:word ;
Function NumberHod(U:word;X:BasTypMas):Longint;
Var k:word; S:Longint;
Procedure BlicSort (mm,tt: Integer; Var A:BasTypMas);
Var ii,jj, xx,ww: Integer;
Begin
ii:=mm; jj:=tt; xx:=A[(mm+tt) Div 2];
Repeat
While A[ii]<xx Do Inc(ii);
While A[jj]>xx Do Dec(jj);
- 58 -
If ii<=jj Then
Begin ww:=A[ii]; A[ii]:=A[jj]; A[jj]:=ww;
Inc(ii); Dec(jj) End
Until ii>jj;
If mm<jj Then BlicSort(mm,jj,A);
If ii<tt Then BlicSort(ii,tt,A);
End;
Begin S:=0;
IF U>1 THEN begin BlicSort(1,U,X);
for k:=1 to U do S:=S+abs(X[k]-X[(U+1)div 2]); end;
NumberHod:=S;
end;
BEGIN
readln(N,M);
UB:=0;UH:=0;UK:=0;
for k1:=1 to M do begin readln(X1,Y1);
if (X1 mod 2=1)AND(Y1 mod 2=1) then begin
inc(UB);XB[UB]:=X1;YB[UB]:=Y1; end;
if (X1 mod 2=0)AND(Y1 mod 2=0) then begin
inc(UH);XH[UH]:=X1;YH[UH]:=Y1; end;
if (X1+Y1) mod 2=1 then begin
inc(UK);XK[UK]:=X1;YK[UK]:=Y1; end;
end;
writeln( NumberHod(UB,XB)+NumberHod(UB,YB));
writeln( NumberHod(UH,XH)+NumberHod(UH,YH));
writeln( NumberHod(UK,XK)+NumberHod(UK,YK));
END.
PROGRAM Zadaha24;
CONST MN = 8;
VAR K,N,I,XP,S:WORD;H:LONGINT;
SM:ARRAY[1..MN] OF WORD;
Function FK(MR:word):LONGINT;
Var J,W:LONGINT;
begin W:=1;
if MR>1 then for J:=1 to MR do W:=W*J;
FK:=W;
end;
BEGIN H:=FK(MN); S:=1;
for K:=1 to MN do READ(SM[K]); READLN;
for N:=1 to MN-1 do
for i:=1 to MN-1 do
if SM[i]>SM[i+1] then begin
XP:=SM[i];SM[i]:=SM[i+1];SM[i+1]:=XP; end;
FOR i:=1 TO MN-1 do
IF (SM[i]=SM[i+1]) THEN S:=S+1 ELSE
BEGIN H:=H div (FK(S)); S:=1;END;
H:=H div (FK(S));
writeln(H:9);
end.
PROGRAM Zadaha25;
Const Nmax=50;
VAR N,M,A,B,KK:byte;
- 59 -
C:real;
SS:ARRAY[1..Nmax,1..2] of byte;
SC:ARRAY[1..Nmax] of real;
i,j,k,l:integer;
BEGIN
READLN(N,M);
for i:=1 to N do begin
READLN(A,B,C); SC[i]:=C;
if A<B then begin SS[i,1]:=A;SS[i,2]:=B;end
else begin SS[i,1]:=B;SS[i,2]:=A;end; end;
KK:=N; While KK>1 do begin
i:=1; while i<=KK do begin
j:=2; while j<=KK do begin
if SS[i,2]=SS[j,1] then begin
l:=0; for k:=1 to KK do
if (SS[k,2]=SS[i,2]) or (SS[k,1]=SS[i,2]) then inc(l);
if l=2 then begin
SC[i]:=(SC[i]*SC[j])/(SC[i]+SC[j]); dec(KK);SS[i,2]:=SS[j,2];
for k:=j to KK do begin SS[k,1]:=SS[k+1,1];
SS[k,2]:=SS[k+1,2];
SC[k]:=SC[k+1]; dec(j);end;
end;end; inc(j); end; inc(i); end;
i:=1; while i<=KK do begin
j:=2; while j<=KK do begin
if (SS[i,1]=SS[j,1]) and (SS[i,2]=SS[J,2]) and (i<>j) then
begin {1} SC[i]:=SC[i]+SC[j]; dec(KK);
for k:=j to KK do begin SS[k,1]:=SS[k+1,1];
SS[k,2]:=SS[k+1,2];
SC[k]:=SC[k+1];dec(j);end;
end; inc(j); end; inc(i); end ;
end;
WRITELN(SC[1]:9:3);
END.
PROGRAM Zadaha26;
VAR I,J,L,X,Y,L1,N,K,Z,X0,Y0:Longint;
MK:ARRAY[0..2,0..2] OF LONGINT;
Begin READLN(L,N);
K:= L*L*(N div (L*L)) + 1; L1:=L;
if K>N then K:=K-L*L;
for I:=0 to 2 do for J:=0 to 2 do MK[I,J]:=0;
X:=1; Y:=1; Z:=1;
for I:=1 to L do BEGIN
if K=N Then begin X0:=X;Y0:=Y; end;
inc(Y); inc(K); END;
Dec(Y); Dec(L);
While (L>0)and(K<=N) do BEGIN
For I:=1 to L do Begin
X:=X+Z; if K=N then begin X0:=X; Y0:=Y; end;
inc(K); End; Z:=Z*(-1);
For I:=1 to L do Begin
Y:=Y+Z; if K=N then begin X0:=X; Y0:=Y; end;
inc(K); End; Dec(L); END;
X:=1; Y:=1; Z:=1; L:=L1;
- 60 -
K:= L*L*(N div (L*L)) + 1;
if K>N then K:=K-L*L;
for I:=1 to L do BEGIN
if (abs(X-X0)<=1)And(abs(Y-Y0)<=1) Then MK[1+X0-X,1+Y0-Y]:=K;
inc(Y); inc(K); END;
Dec(Y); Dec(L);
While (L>0) do BEGIN
For I:=1 to L do Begin X:=X+Z;
if (abs(X-X0)<=1)And(abs(Y-Y0)<=1) Then MK[1+X0-X,1+Y0-Y]:=K;
inc(K); End; Z:=Z*(-1);
For I:=1 to L do Begin Y:=Y+Z;
if (abs(X-X0)<=1)And(abs(Y-Y0)<=1) Then MK[1+X0-X,1+Y0-Y]:=K;
inc(K); End; Dec(L); END;
IF N>L1*L1 THEN Write((N-L1*L1):11);
IF N+L1*L1<=L1*L1*L1 THEN Write((N+L1*L1):11);
IF MK[0,1]<>0 THEN Write(MK[0,1]:11);
IF MK[2,1]<>0 THEN Write(MK[2,1]:11);
IF MK[1,0]<>0 THEN Write(MK[1,0]:11);
IF MK[1,2]<>0 THEN Write(MK[1,2]:11);
Writeln;
end.
program Zadaha27;
Var i,k,c,t:byte; N,d,H:longint;
MN:array[1..10] of byte;
R:array[1..20] of byte;
BEGIN
READLN(N); d:=0;
if N>=5 then BegiN { -1- }
H:=5; while H<=N do
begin d:=d+N div H; H:=H*5; end;
{ -2- } i:=1; While N>0 do
begin MN[i]:=N mod 10; i:=i+1;
N:=N div 10; end;
{ -3- } k:=0;
While d>0 do begin c:=d mod 10;
for i:=1 to 10 do { -4- }
begin R[i+k]:=R[i+k]+MN[i]*C;
for t:=i+k to 19 do begin
R[t+1]:=R[t+1]+R[t] div 10;
R[t]:=R[t] mod 10; end;
end;
{----4}
k:=k+1; d:=d div 10;
end; {----3}
{ -5- }i:=20;
While R[i]=0 do i:=i-1;
While i>0 do begin
write(R[i]:1); i:=i-1; end;
writeln;
EnD else WRITELN(0);
END.
program Zadaha28;
- 61 -
var A,B,C,BK,Z,RA,RB,B1,A1:LONGINT;
I,K,RX,P,P1,X1,KX:WORD;
begin readln(C); P1:=0;A:=2;
while (P1=0)AND(A*2-1<C) do beGin
Z:=1;K:=0; while C+1>Z do BegiN Z:=Z*A;K:=K+1;EnD;
if K mod 2 =0 then Begin K:=K-1;Z:=Z div A; end;
while (P1=0)AND(A>B)AND(K>1) do Begin
BK:=1 ; B:=1; while (Z-BK>C) do begin
B:=B+1;BK:=1;for I:=1 to K do BK:=BK*B;end;
if Z-BK=C then
BEGIN A1:=A;B1:=-B;X1:=K;P1:=1;END else
BEGIN K:=K-1; Z:=Z div A;END;End;A:=A+1;eNd;
P:=0;A:=2; IF X1>2 THEN KX:=X1 ELSE KX:=2;
while (P=0)AND(A<sqrt(C)) do beGin
Z:=1;K:=0; while C-1>Z do BegiN Z:=Z*A;K:=K+1;EnD;
while (P=0)AND(K>=KX) do Begin
BK:=1 ; B:=1; while (C-Z>BK)AND(B<=A) do begin
B:=B+1;BK:=1;for I:=1 to K do BK:=BK*B;end;
if C-Z=BK then
BEGIN RA:=A;RB:=B;RX:=K;P:=1;END else
BEGIN K:=K-1; Z:=Z div A; END; End;A:=A+1;eNd;
If RX<X1 Then begin RX:=X1;RA:=A1;RB:=B1; end;
if RX>1 Then writeln(RA:11,RB:11,RX:4)
Else Writeln(C-1:11,1:11,1:4);
end.
PROGRAM Zadaha29;
LABEL M1;
CONST MN=40;
VAR X,Y,VX,VY:ARRAY[1..MN] OF REAL;
N,I,J,K,P,R,S,UX,UY,PX,PY:INTEGER;
TP:REAL;
BEGIN
READLN(N);UX:=0;UY:=0;I:=1;R:=0;PX:=0;PY:=0;
REPEAT
READLN(X[I],Y[I]); IF I>1 THEN BEGIN
IF (X[I]=X[I-1])and(Y[I]=Y[I-1]) THEN
N:=N-1 ELSE I:=I+1; END ELSE I:=2;
UNTIL I=N+1;
FOR I:=1 TO N-1 DO
IF ((X[I]=0)AND(X[I+1]=0))OR((Y[I]=0)AND(Y[I+1]=0))
THEN BEGIN R:=1; GOTO M1; END;
FOR I:=1 TO N-1 DO BEGIN
IF X[I]*X[I+1]<=0 THEN BEGIN P:=1;
IF (Y[I]=Y[I+1])OR(X[I]=0) THEN TP:=Y[I] ELSE
BEGIN IF X[I+1]=0 THEN TP:=Y[I+1] ELSE
TP:=Y[I]-X[I]*(Y[I+1]-Y[I])/(X[I+1]-X[I]);END;
FOR J:=1 TO UY DO IF TP=VY[J] THEN P:=0 ;
IF P=1 THEN BEGIN UY:=UY+1; VY[UY]:=TP;END;
END;
IF Y[I]*Y[I+1]<=0 THEN BEGIN P:=1;
IF (X[I]=X[I+1])OR(Y[I]=0) THEN TP:=X[I] ELSE
BEGIN IF Y[I+1]=0 THEN TP:=X[I+1] ELSE
TP:=X[I]-Y[I]*(X[I+1]-X[I])/(Y[I+1]-Y[I]);END;
- 62 -
FOR J:=1 TO UX DO IF TP=VX[J] THEN P:=0 ;
IF P=1 THEN BEGIN UX:=UX+1; VX[UX]:=TP;END;
END;
END;
FOR J:=1 TO UX DO IF VX[J]=0 THEN PX:=1;
FOR J:=1 TO UY DO IF VY[J]=0 THEN PY:=1;
S:=UX+UY-PX*PY;
M1: IF R=1 THEN WRITELN('!!!') ELSE WRITELN(S:3);
END.
program Zadaha30;
var N,K,M:LONGINT;
R:BYTE;
begin
readln(N,K,M);
N:=N mod 2;
M:=M mod 2;
K:=K mod 2;
If (N+M+K)mod 2 = 0 Then
begin
N:=1-N;
M:=1-M;
K:=1-K;
end;
if N=1 Then R:=1;
if M=1 Then R:=3;
if K=1 Then R:=2;
Writeln(R);
end.
program Zadaha31;
CONST PR=100;
var C,D,A,K:longint; VK:string;
I,J,NM:WORD;ZN:integer;
R:ARRAY[1..2,1..PR] OF LONGINT;
function HOD(x,y:longint):longint;
begin while x<>y do
if x>y then x:=x-y else y:=y-x;HOD:=x;
end;
BEGIN
readln(C);D:=2;NM:=1;
IF C<0 THEN ZN:=-1 ELSE ZN:=1;
IF ABS(C)<=1 THEN BEGIN
IF C=-1 THEN VK:='ЛЮБОЕ НЕЧЕТНОЕ ЧИСЛО РАЗ'
ELSE VK:='ЛЮБОЕ ЧИСЛО РАЗ';
WRITELN( VK, C:14);
END ELSE BEGIN C:=ABS(C);
REPEAT
WHILE C mod D = 0 DO BEGIN
R[2,NM]:=R[2,NM]+1; C:=C div D; END;
IF R[2,NM]<>0 THEN BEGIN R[1,NM]:=D;
NM:=NM+1; END;
IF D>2 THEN D:=D+2 ELSE D:=D+1;
IF (D>sqrt(C))AND(C<>1) THEN BEGIN
- 63 -
R[1,NM]:=C;R[2,NM]:=1;NM:=NM+1;C:=1;
END;
UNTIL C=1;
NM:=NM-1; K:=R[2,1];
FOR I:=2 TO NM DO K:=HOD(K,R[2,I]);
IF ZN<0 THEN WHILE K mod 2 = 0 DO K:=K DIV 2;
FOR I:=1 TO NM DO R[2,I]:=R[2,I] div K;
A:=1;
FOR I:=1 TO NM DO
FOR J:=1 TO R[2,I] DO A:=A*R[1,I];
WRITELN(K:10,ZN*A:10);
END;
end.
program Zadaha32;
type DIM=ARRAY[0..1] OF BYTE;
const NM=100;
var A:^DIM;N,I,J,G,K:integer;
M:ARRAY[1..NM] OF WORD;{$R-}
begin
readln(G,N); K:=0;
for I:=1 to N do begin
read(M[I]);K:=K+M[I];end;readln;
GetMem(A,K);A^[0]:=1;
for I:=1 to K do A^[I]:=0;
if G>K then writeln('NO') else begin
for I:=1 to N do begin
for J:=K-M[I] downto 0 do
if (A^[J]=1) then A^[J+M[I]]:=1;
for J:=0 to K do if A^[J]=1 then A^[abs(J-M[I])]:=1;
end;
if A^[G]=1 then writeln('YES') else writeln('NO'); end;
FreeMem(A,K);{$R+}
end.
program Zadaha33;
var ag,bg,kg,cg,dg:longint;
function KK(a,b:longint):longint;
var a1,b1,c,s:longint;
function HOD(x,y:longint):longint;
begin while x<>y do
if x>y then x:=x-y else y:=y-x;HOD:=x;end;
begin if (a<1)or(b<1) then KK:=0 else
if (a=1)or(b=1) then begin if (a=1) then KK:=b;
if (b=1) then KK:=a; end else
if HOD(a,b)<>1 THEN beGin
c:=HOD(a,b); a1:=a div c; b1:=b div c;
if c mod 2 =1 then KK:=2*(HOD(a,b)-1)*(a1+b1-1)+KK(a1,b1) else
KK:=2*(a+b)-4*(HOD(a div 2,b div 2)); eNd
ELSE beGin
if a mod 2= 0 then begin a:=a+b;b:=a-b;a:=a-b;end;
if b mod 2= 0 then KK:=2*(b+a-1)-2*(b div (2*a)+1) else
begin if a>b then s:=2*b else s:=2*a;
KK:=2*(b+a)-2*((a+b) div s+1)-1; end; eNd;
end;
- 64 -
BEGIN readln(ag,bg,cg,dg); WRITELN(cg*dg*KK(ag,bg):11);
end.
program Zadaha34;
var SN:array[0..36] of word;
NB,SCB,sci,scm,a,b,k,m,s,Zm:word; L:char;
begin
for a:=0 to 36 do SN[a]:=0;READLN(L); NB:=Ord(L)-Ord('A')+1;
for a:=0 to 99 do for b:=0 to 99 do begin
k:= a mod 10 + a div 10 ; if k = b mod 10 + b div 10 then
SN[2*k]:=SN[2*k]+1;end;
m:=1 ; Zm:=1;
SCB:= NB mod 10 + NB div 10 ;
for a:=1 to 26 do begin
sci:= a mod 10 + a div 10;
scm:= m mod 10 + m div 10;
if a=NB then s:=1 else s:=2;
if s*SN[SCB+sci]>Zm*SN[scm+SCB] then begin m:=a; Zm:=s ;end;
end;
WRITELN(chr(m+ord('A')-1));
end.
PROGRAM Zadaha35;
CONST MN = 10000;
VAR
N,X,Y,Z,U,K,F,V,M,min,W,Q,S:LONGINT;
I,J:WORD;A,B:ARRAY[1..MN] OF BYTE;
Begin
READLN(N,X,U,K,F);
for I:=1 to N*X do BEGIN
READ(B[I]);A[I]:=I;END; READLN;
Z:=N*X;V:=-1;M:=Z; min:=U;W:=1;
REPEAT W:=(W+K-1) mod M;
IF W=0 THEN W:=M;Q:=A[W];M:=M-1;
FOR I:=W TO M DO A[I]:=A[I+1]; A[M+1]:=Q;
UNTIL (M=Z-U) ;
FOR I:=0 TO Z-1 DO BEGIN S:=0;
FOR J:=Z-U+1 TO Z DO BEGIN Y:=(I+A[J]) mod Z;
IF Y=0 THEN Y:=Z; IF B[Y]=F THEN S:=S+1; END;
IF min>S THEN BEGIN V:=I+1; min:=S; END; END;
writeln(V:9,min:9);
end.
program Zadaha36;
var N,K,i,ic,C,V,w:integer; MC:array[0..5] of byte;
begin
readln(N); K:=0;
if (N<2000) and (N>11) and (N mod 2=1) then begin
V:=N;ic:=0;C:=11; w:=0;
While V>0 do begin inc(w);
MC[w]:=V mod 10;
if (MC[w] mod 2=0)and(MC[w]<C) then
begin C:=MC[w]; ic:=w; end; V:=V div 10; end;
- 65 -
if ic>0 then begin MC[ic]:=MC[1]; MC[1]:=C;
if (w>2)and(MC[2]>MC[3]) then
begin C:=MC[2];MC[2]:=MC[3];
MC[3]:=C; end; V:=0;
for i:=w downto 1 do V:=10*V+MC[i];
K:=V-N; if K>0 then K:=K+1 else K:=0; end; end;
writeln(K:5);
end.
program Zadaha37;
Var A,B,C:real;
AS,BS,CS:string;
Function ULP(HS:string):string;
Var i:word; ST:string;
begin ST:='';
for i:=1 to length(HS) do
if HS[i]<>' ' then ST:=ST+HS[i];
ULP:=ST;
end;
Function FU(HS:string):real;
Var z,t,j:word;
Ch,Ps:longint;
Dh:real;
begin t:=pos('.',HS); z:=pos('-',HS);
Dh:=0; if t<>0 then begin Ps:=2;
for j:=t+1 to length(HS) do begin
if HS[j]='1' then Dh:=Dh+1/Ps; Ps:=Ps*2;end;end;
Ch:=0; Ps:=1; if t=0 then t:=length(HS)+1;
for j:=t-1 downto z+1 do begin
if HS[j]='1' then Ch:=Ch+Ps; Ps:=Ps*2;end;
if z=1 then FU:=(-1)*(Ch+Dh) else FU:=Ch+Dh;
end;
Function DPX(SH:real;w:word):string;
Var RE,CHS,DHS,SSS:string; CF,k:byte;
CHH:longint; DHH:real;
begin CHS:=''; DHS:='';
if SH<0 then RE:='-' else RE:='';
SH:=abs(SH); CHH:=trunc(SH); DHH:=frac(SH);
for k:=1 to w+1 do begin
DHH:=DHH*2;str(trunc(DHH),SSS);DHS:=DHS+SSS;
DHH:=frac(DHH);end;
if DHS[w+1]='1' then begin k:=w ;
While (DHS[k]='1')and(k>0) do begin
delete(DHS,k,1); insert('0',DHS,k);k:=k-1;end;
if k>0 then begin delete(DHS,k,1); insert('1',DHS,k);end;
end;delete(DHS,w+1,1);
if CHH=0 then CHS:='0' else begin
While CHH>1 do begin str((CHH mod 2),SSS);
CHS:=SSS+CHS;CHH:=CHH div 2;end;CHS:='1'+CHS;
if k=0 then begin k:=length(CHS);
While (CHS[k]='1')and(k>0) do begin
delete(CHS,k,1); insert('0',CHS,k);k:=k-1;end;
- 66 -
if k>0 then begin delete(CHS,k,1); insert('1',CHS,k);end
else insert('1',CHS,1);
end;
end;
DPX:=RE+CHS+'.'+DHS;
end;
BEGIN
READLN(AS); AS:=ULP(AS);
READLN(BS); BS:=ULP(BS);
READLN(CS); CS:=ULP(CS);
IF FU(AS)=0 THEN begin
IF FU(CS)=FU(BS) THEN Writeln('X-любое')
ELSE Writeln('Решений нет'); end
ELSE WRITELN(DPX((FU(CS)-FU(BS))/FU(AS),2));
END.
Program Zadaha38;
const mn=255;
Var i,j,N,k,s,z:word;
X:array[1..mn*3] of real;
A,B,C,F:real;
procedure FU(Ag,Bg,Cg:real);
begin
X[k]:=abs((Ag*Ag+Bg*Bg-Cg*Cg)/(Ag*Bg));k:=k+1;
end;
BEGIN
READLN(N); k:=1; for i:=1 to N do begin
READLN(A,B,C); IF (A=B)and(B=C) THEN FU(A,B,C) ELSE
if (A-B)*(B-C)*(A-C)<>0 then begin
FU(A,B,C);FU(C,B,A);FU(A,C,B); end else begin
IF C=B THEN begin FU(A,B,C); FU(B,C,A); end;
IF A=B THEN begin FU(A,B,C); FU(A,C,B); end;
IF C=A THEN begin FU(A,B,C); FU(A,C,B); end;
end;
end; k:=k-1;
for i:=1 to k-1 do for j:=1 to k-1 do if X[j]>X[j+1] then
begin F:=X[j]; X[j]:=X[j+1]; X[j+1]:=F; end; s:=1;
for j:=1 to k-1 do if abs(X[j]-X[j+1])<0.0000001 then s:=s+1 else
begin if s>z then z:=s; s:=1; end;if s>z then z:=s;
writeln(z);
END.
program Zadaha39;
Var i:word;
St1,St2,St3:string;
Function PVV(Str,Stp2:string):boolean;
Var k,j:word;PR: boolean; Stp1:string;
begin Stp1:=Str;PR:=True;j:=1;
While PR and (j<=length(Stp2)) do begin
k:=POS(Stp2[j],Stp1); PR:=PR and (k>0) ;
if PR and (k<>length(Stp1)) then
Stp1:=copy(Stp1,k+1,length(Stp1)-k) else Stp1:='';
j:=j+1; end; PVV:=PR;
end;
BEGIN READLN(St1); St3:='';READLN(St2);
for i:=1 to length(St1) do St3:=St1[i]+St3;
- 67 -
IF PVV(St1,St2) THEN writeln('YES') ELSE writeln('NO');
IF PVV(St3,St2) THEN writeln('YES') ELSE writeln('NO');
END.
program Zadaha40;
const mn=26;
Var i,N:byte;
X:array[1..mn] of real;
S,F,Z,K:real;
BEGIN
READLN(N);
for i:=1 to N do READ(X[i]);
READLN(S,F,Z);
IF Z=S THEN begin IF F=S THEN
writeln('ЛЮБОЙ % СОСТАВ') ELSE writeln('PEШЕНИЯ НЕТ');
end ELSE begin
X[N+1]:=(F-S)/(Z-S);
IF (X[N+1]<=0) OR (X[N+1]>=1) THEN writeln('PEШЕНИЯ НЕТ') ELSE begin
K:=1-X[N+1];
for i:=1 to N do write (K*X[i]:8:2); writeln(100*X[N+1]:8:2);
end;
end;
END.
Program Zadaha41;
const m=177;
var z,n,i,j,q:longint;
A:array[1..m,1..m] of word; f:text;
Procedure PRKV(x,y,k:word);
Var iu,zu,ju:longint;
begin for iu:=1 to k div 2 do
for ju:=1 to k do begin
zu:=A[x+iu-1,y+ju-1];
A[x+iu-1,y+ju-1]:=A[x+k-iu,y+k-ju];
A[x+k-iu,y+k-ju]:=zu;end;
if k mod 2=1 then for iu:=1 to k div 2 do begin
zu:=A[x+(k div 2),y+iu-1];
A[x+(k div 2),y+iu-1]:=A[x+(k div 2),y+k-iu];
A[x+(k div 2),y+k-iu]:=zu;
end;end;
Procedure PRKV1(x,y,k:word);
Var iu,ju,zu:longint;
begin for iu:=1 to k div 2 do
for ju:=1 to k do begin
zu:=A[x+iu-1,y+ju-1];
A[x+iu-1,y+ju-1]:=A[x-iu+k,y-ju+k];
A[x-iu+k,y-ju+k]:=zu;
end;end;
BEGIN readln(n);assign(f,'MGKV.txt');rewrite(f);
if n mod 2 = 1 then begin j:=n div 2;i:=j+1;z:=0;
while (z<n*n) do begin inc(i);inc(j);inc(z);
if i>n then i:=i-n; if j>n then j:=j-n;
A[i,j]:=z; if z mod n=0 then
begin inc(i);dec(j); end;
- 68 -
end; end else begin if n mod 4 <> 0 then inc(n,2);
q:=0; for i:=1 to n do for j:=1 to n do begin inc(q);
A[i,j]:=q;end;q:=n div 4;PRKV1(q+1,q+1,q*2);PRKV(1,1,q);
PRKV(n-q+1,1,q); PRKV(1,n-q+1,q); PRKV(n-q+1,n-q+1,q);
for i:=1 to q do for j:=1 to q do begin
z:=A[n+i-q,n+j-q]; A[n+i-q,n+j-q]:=A[i,j]; A[i,j]:=z;
z:=A[n+i-q,j]; A[n+i-q,j]:=A[i,n+j-q]; A[i,n+j-q]:=z;
end;
end; writeln(f,n);
for i:=1 to n do begin
for j:=1 to n do write(f,A[i,j]:6);writeln(f);end;
close(f);
end.
PROGRAM Zadaha42;
Var VG,VS:BYTE; NVG,NVS:string;
Begin
readln(VS,VG);
if VS=24 then VS:=0; if VG=12 then VG:=1;
Case VS of
0..5 : NVS:='NIGHT';
6..10: NVS:='MORNING';
11..17: NVS:='DAY';
18..23: NVS:='EVENING'; end;
Case VG of 1..2: NVG:='WINTER';
3..5: NVG:='SPRING';
6..8: NVG:='SUMMER';
9..11: NVG:='AUTUMN'; end;
Writeln(NVS+' '+NVG);
end.
PROGRAM Zadaha43;
Var KU,SG,N,W:Longint;
Begin KU:=0; SG:=0;
readln(N);
While N>0 do Begin if N mod 2 = 0 then W:=9 else W:=11;
inc(SG,W);dec(N,W);inc(KU); if N>0 then inc(N,8); end; inc(SG,N);
Writeln(KU,' ',SG);
end.
PROGRAM Zadaha44;
VAR V:array[1..7] of longint;
i:integer; X:real; R:longint;
function NOD(n,m:longint):longint;
begin while (n<>0) and (m<>0) do begin
if n>m then n:=n mod m else m:=m mod n;end;NOD:=m+n;
end;
BEGIN
for i:=1 to 7 do begin READ(X); V[i]:=round(1000000*X);end;
R:=V[1];for i:=2 to 7 do R:=NOD(R,V[i]);
WRITELN(R/1000000:11:6);
END.
PROGRAM Zadaha45;
VAR
- 69 -
DD,GG,MM,DN,D1D,S1,S5,i,MMk,DDk,GGk:word;
dat1,dat2:string;
Function VG(B:word):boolean;
Begin
VG:=False;
if B mod 4=0 then VG:=True;
if B mod 100=0 then VG:=False;
if B mod 400=0 then VG:=True;
End;
Function KDM(C,WW:word):byte;
var kk:byte;
Begin
if (C>0) and (C<13) then begin
kk:=31; case C of
4,6,9,11: kk:=30;
2: if VG(WW) then kk:=29 else kk:=28;
end; end;
KDM:=kk;
End;
BEGIN
readln(D1D);readln(dat1);readln(dat2);
DN:=D1D; val(copy(dat1,1,2),DD,i);S1:=0;S5:=0;
val(copy(dat1,4,2),MM,i);val(copy(dat1,7,4),GG,i);
val(copy(dat2,7,4),GGk,i);val(copy(dat2,4,2),MMk,i);val(copy(dat2,1,2),DDk,i);
if (DD=13)and(DN=5) then inc(S5);if (DD=13)and(DN=1) then inc(S1);
repeat
inc(DN);if DN=8 then DN:=1;
inc(DD);if DD=KDM(MM,GG)+1 then begin DD:=1;
inc(MM);if MM=13 then begin MM:=1;inc(GG); end;end;
if (DD=13)and(DN=5) then inc(S5); if (DD=13)and(DN=1) then inc(S1);
until (GG=GGk)and(MM=MMk)and(DD=DDk);
WRITELN(S1:5,S5:5);
END.
program Zadaha46;
var a,b,c,d:real;
Function DDD(w,v,z:real):real;
var x,p:real;
begin p:=(w+v+z)/2;
x:=2*sqrt(p*(p-w)*(p-v)*(p-z))/w;
DDD:=w*x/(w+x);
end;
Begin
readln(a,b,c);
IF a<b THEN begin d:=a; a:=b; b:=d; end;
IF a<c THEN begin d:=a; a:=c; c:=d; end;
writeln(4*DDD(a,b,c):8:3);
End.
Program Zadaha47;
const Ba=26;Ds=80;
var RS:array[0..Ba*Ds] of boolean;
i,K:longint; C:char; f:text;
begin assign(f,'ishtext.txt'); reset(f);
- 70 -
K:=0; for i:=0 to Ba*Ds do RS[i]:=False;
Repeat
read(f,C);
if (C=' ')or(EOF(f)) then begin RS[K]:=True; K:=0; end
else begin
if (C>='A') and (C<='Z') then K:=K+(ord(C)-ord('A')+1);
if (C>='a') and (C<='z') then K:=K+(ord(C)-ord('a')+1);
end;
Until EOF(f) ; close(f);
for i:=1 to Ba*Ds do if RS[i] then inc(K);
writeln(K);
end.
Program Zadaha48;
var T:word; S1,S2,S:string;
Begin
readln(S1);readln(S2);
if S1=S2 then Writeln(1) else begin
if length(S1)<length(S2) then begin s:=S1;S1:=S2;S2:=s;end;T:=0;
While (length(S1)>=length(S2))and(0<>POS(S2,S1))do
begin inc(T);DELETE(S1,1,(Pos(S2,S1)+length(S2)-1));end;
Writeln(T);end;
end.
Program Zadaha49;
var L0,L,M,S,N,i:word;
Begin
readln(N);
if N=0 then Writeln(0) else begin
M:=1;S:=1; read(L0);
for i:=2 to N do begin Read(L);
if L0=L then inc(S) else begin
if M<S then M:=S; S:=1; L0:=L; end;end;
if M<S then M:=S;
Writeln(M);end;
end.
PROGRAM Zadaha50;
Var N,X,K:integer;
Begin
readln(N,X);
if (X>3*(N-1)) or (X<0) then Writeln('NO') else begin
K:=N-1; While X>K do Begin X:=X-3; K:=K-1; end;
Writeln(X);end;
end.
Program Zadaha51;
var X,Y: array [1..3] of real; i:word;
a1,a2,b1,b2,v,w:real; kx,k1,k2:byte;
Begin
for i:=1 to 3 do readln(X[i],Y[i]);
if ((X[1]=X[2])and(X[2]=X[3]))or((Y[1]=Y[2])and(Y[2]=Y[3])) then
Writeln('NO') else begin kx:=0;k1:=0;k2:=0;
- 71 -
if Y[1]=Y[2] then begin kx:=1; V:=(X[1]+X[2])/2; end else
begin k1:=1; a1:=(X[1]-X[2])/(Y[2]-Y[1]);
b1:=((X[1]+X[2])*(-a1)+Y[2]+Y[1])/2; end;
if Y[3]=Y[2] then begin kx:=1; V:=(X[3]+X[2])/2; end else
begin k2:=1; a2:=(X[3]-X[2])/(Y[2]-Y[3]);
b2:=((X[3]+X[2])*(-a2)+Y[2]+Y[3])/2; end;
V:=kx*V+k1*k2*(b2-b1)/(a1-a2);
if k1=1 then W:=a1*V+b1 else W:=a2*V+b2;
Writeln(V:12:3,W:12:3);end;
end.
Program Zadaha52;
Const C=10000;
Var i,G,K,N:longint; s:string;
R:array[1..10000] of longint;
Function Prost(Z:longint):Boolean;
var j:longint;
Begin Prost:=False; j:=2;
While (Z mod j <> 0) and (j<=sqrt(Z)) do inc(j);
If j>sqrt(Z) then Prost:=True;
End;
Procedure UMN(x:longint);
var m:longint;
Begin For m:=1 to G do R[m]:=x*R[m]; For m:=1 to G do
begin R[m+1]:=R[m+1]+R[m] div C; R[m]:=R[m] mod C; end;
While R[G+1] div C > 0 do Begin
inc(G); R[G+1]:=R[G+1]+R[G] div C;R[G]:=R[G] mod C; End;
if R[G+1] <> 0 then inc(G);
End;
Begin
G:=1; For i:=1 to 10000 do R[i]:=0; R[1]:=1;
readln(N);
for i:=2 to N do
if PROST(i) then begin K:=i;
While K<=N do begin K:=K*i; UMN(i);end;end;
Write(R[G]);
for i:=G-1 downto 1 do begin Str(R[i],s);
While Length(s)<4 do s:='0'+s;Write(s:4);end;
Writeln;
End.
PROGRAM Zadaha53;
CONST NMAX=1000;
VAR S,R:REAL;
N,H,VG,NG,i:LONGINT;
K:ARRAY[0..NMAX+1] OF LONGINT;
BEGIN
readln(N,S,K[0],K[N+1]);H:=K[0]+K[N+1];
for i:=1 to N do begin readln(R,K[i]);
H:=H+K[i]; end;
if H mod 2 =1 then begin VG:=H div 2 +1; NG:=VG; end else
begin NG:=H div 2; VG:=NG+1; end;
i:=0; H:=K[0];
while H<NG DO begin
- 72 -
i:=i+1; H:=H+K[i];end;WRITE(i:5);
while H<VG DO begin
i:=i+1; H:=H+K[i];
WRITE(i:5); end;
WRITELN;
END.
Program Zadaha54;
var AS,BS:string;
a1,a2,b1,b2,c1,c2,w1,w2,M,Y,i,k:longint;
Procedure PSH(SH:string;Var v1,v2:longint);
Var ii,qq:word;
begin for ii:=1 to length(SH) do if SH[ii]=' ' then DELETE(SH,ii,1);
if length(SH)>9 then begin Val(copy(SH,1,length(SH)-9),v1,qq);
Val(copy(SH,length(SH)-8,9),v2,qq);end else begin v1:=0;
Val(SH,v2,qq);end;
end;
Procedure SUM(q,z1,z2:longint;Var r1,r2:longint);
begin r2:=(q+z2) mod 1000000000; r1:=z1+(q+z2) div 1000000000;
end;
Function RKN(n1,n2:longint):longint;
Var ii,xr:longint;
begin xr:=0; for ii:=1 to 9 do begin
case (n2 mod 10) of
1: inc(xr,2);
2,3,5: inc(xr,5);
4: inc(xr,4);
7: inc(xr,3);
8: inc(xr,7);
else inc(xr,6);
end; n2:=n2 div 10; end;
for ii:=1 to 6 do begin
case (n1 mod 10) of
1: inc(xr,2);
2,3,5: inc(xr,5);
4: inc(xr,4);
7: inc(xr,3);
8: inc(xr,7);
else inc(xr,6);
end; n1:=n1 div 10; end;
RKN:=xr;
end;
begin M:=0;
Readln(AS);PSH(AS,a1,a2);Readln(BS);PSH(BS,b1,b2);Readln(k);
for i:=0 to k-1 do begin SUM(i,a1,a2,c1,c2);M:=M+RKN(c1,c2);end;
Y:=M; w1:=a1; w2:=a2;
WHILE (a1<>b1)or(a2<>b2) do begin
SUM(k,a1,a2,c1,c2); Y:=Y-RKN(a1,a2)+RKN(c1,c2);SUM(1,a1,a2,a1,a2);
if M>Y then begin M:=Y; w1:=a1; w2:=a2; end; end;
if w1=0 then writeln(w2) else begin
str(w1,AS); str(w2,BS); While length(BS)<9 do BS:='0'+BS;
Writeln(AS+BS);end;
end.
- 73 -
PROGRAM Zadaha55;
const nm=1000;
VAR Z,K,i,ii,t,tg,tu,tz,lr,pr,pr1:longint;
M:array[1..nm] of byte;
Procedure UMN3;
begin pr:=0; Z:=0;
for ii:=1 to lr do begin pr1:=(3*M[ii]+pr) div 10;
M[ii]:=(3*M[ii]+pr) mod 10; pr:=pr1; end;
if pr>0 then begin M[lr+1]:=pr; inc(lr);end;
end;
Procedure DIV2;
begin pr:=0; Z:=0;
for ii:=lr downto 1 do begin
if (M[ii]+pr) mod 2 = 0 then pr1:=0 else pr1:=10;
M[ii]:=(M[ii]+pr) div 2; pr:=pr1; end;
end;
Begin READLN(K); tg:=7; tu:=8; t:=tg; Z:=0;
for i:=1 to nm do M[i]:=0; lr:=0;
While K>0 do begin inc(lr);
M[lr]:=K mod 10; K:=K div 10;
if lr mod 2 =1 then inc(Z,M[lr])
else dec(Z,M[lr]);
end;
While ((abs(Z)) mod 11<>0)or(t mod 24 <>0) do begin
if tg<=tu then begin DIV2; t:=tg ;tz:=tg+7; end;
if tg>=tu then begin UMN3; t:=tu ;tu:=tu+8; end;
tg:=tz; if t mod 24 =0 then begin
Z:=0; for i:=1 to lr do
if i mod 2 =1 then inc(Z,M[i])
else dec(Z,M[i]); end;
end;
for i:=lr downto 1 do Write(M[i]:1); Writeln;
END.
PROGRAM Zadaha56;
VAR N,i:longint; S,S0,C,Z:real;
DCA:array[11..1000] of real;
Function FDZC(X:real;Y:word):real;
Var SH,H:string; XC:longint; q:word; XD:real;
begin SH:='.'; XC:=trunc(X); XD:=X-XC;
While XC>=Y do begin
Str( (XC mod Y),H); SH:=H+SH; XC:=XC div Y; end;
Str(XC,H);SH:=H+SH;
for q:=1 to 13 do begin
XC:=trunc(XD*Y); Str(XC,H); SH:=SH+H;
XD:=XD*Y-XC; end;
Val(SH,XD,q);FDZC:=XD;
end;
Begin READLN(S,N,C); S0:=0;
for i:=11 to N+10 do begin
DCA[i]:=FDZC(C,i); S0:=S0+DCA[i]; end;
Z:=S0-S;
for i:=11 to N+10 do
if abs(Z-DCA[i])=0 then Write(i:5); Writeln;
- 74 -
END.
PROGRAM Zadaha57;
CONST MN = 1000;
VAR
M1:REAL;
V,I,Q,N:WORD;
K:ARRAY[0..MN,1..3] OF REAL;
TR:ARRAY[1..MN,1..2] OF REAL;
Function R(S,U:Word):REAL;
Var J:word; RR:real;
begin RR:=0;
For J:=1 to 3 do RR:=RR+(K[S,J]-K[U,J])*(K[S,J]-K[U,J]);
R:=sqrt(RR);
end;
Begin
READLN(N); K[0,1]:=0; K[0,2]:=0; K[0,3]:=0;
for I:=1 to N do READLN(K[I,1],K[I,2],K[I,3]);
for I:=0 to N do TR[I,2]:=R(0,I);
for I:=1 to N do begin TR[I,1]:=0;
for Q:=1 to N do TR[I,1]:=TR[I,1]+R(I,Q);
if (I=1)OR(M1>TR[I,1]) then
begin M1:=TR[I,1];V:=I; end;
end;
for I:=1 to N do
IF (M1=TR[I,1])and(TR[I,2]<TR[V,2]) THEN V:=I;
writeln(K[V,1]:9:3,K[V,2]:9:3,K[V,3]:9:3);
end.
PROGRAM Zadaha58;
const
PDM:array[1..11] of byte = (2,3,5,7,11,13,17,19,23,29,31);
VAR DD,GG,MM,KPG,GGk,nnd,knd:longint;
dat:string; q,k,i,j,jGR,iu,ju,n0,ZZ:word;
NPD:array[1..52] of word; TTD:array[1..2000] of longint;
Function PPR(Z:longint):boolean;
var m:longint;
begin PPR:=False; if (Z>1) then begin m:=2;
WHILE (Z mod m <> 0) and (sqrt(Z)>=m) do inc(m);
if m>sqrt(Z) then PPR:=True;end;end;
Function VG(B:word):boolean;
Begin VG:=False; if B mod 4=0 then VG:=True;
if B mod 100=0 then VG:=False; if B mod 400=0 then VG:=True;
End;
Function KDM(WWC:word):byte;
Begin KDM:=31; case WWC of
4,6,9,11: KDM:=30;
2: KDM:=28;
end;End;
Function FKD(A,B:longint):longint;
var mi,CG,dn,dk,S:longint;
begin S:=0;if (B>A) then begin
CG:=B div 10000 - A div 10000; inc(S,(CG*365));
if B mod 10000 < A mod 10000 then begin
- 75 -
dn:= B mod 10000; dk:= A mod 10000;
dec(S,(KDM(dn div 100)-1-dn mod 100 + dk mod 100));end
else begin dk:= B mod 10000; dn:= A mod 10000;
inc(S,(KDM(dn div 100)+1-dn mod 100 + dk mod 100));end;
mi:=dn div 100 ; WHILE ( mi < dk div 100) do
begin inc(mi); if B mod 10000 < A mod 10000 then
Dec(S,KDM(mi)) else inc(S,KDM(mi)); end;
if A div 100 = B div 100 then Dec(S,KDM(dn div 100));
for mi:= A div 10000 to B div 10000 do if VG(mi) then inc(S);
{if (VG(A div 10000))and(A mod 10000 > 229) then Dec(S);
if (VG(B div 10000))and(B mod 10000 < 229) then Dec(S);}
end; FKD:=S;
end;
BEGIN k:=1; for i:=1 to 5 do begin case i of
1: jGR:=9;
5: jGR:=10;
else jGR:=11;
end;
for j:=1 to jGR do begin
NPD[k]:=100*PDM[i]+PDM[j];inc(k);end; end;
readln(dat);
val(copy(dat,1,2),DD,q);val(copy(dat,4,2),MM,q);
val(copy(dat,7,4),GG,q); nnd:=10000*GG+100*MM+DD;
readln(dat);readln(ZZ);val(copy(dat,7,4),GGk,q);
val(copy(dat,4,2),MM,q);val(copy(dat,1,2),DD,q);
knd:=10000*GGk+100*MM+DD;
WHILE (Not(PPR(GG)))and(GG<=GGk) do begin
inc(GG);nnd:=10000*GG+202;end;
WHILE (Not(PPR(GGk)))and(GG<=GGk) do begin Dec(GGk);
knd:=10000*GGk+1129; end; iu:=1; ju:=52;
if nnd mod 10000 < 202 then
nnd:=202+10000*(nnd div 10000);
if knd mod 10000 >1129 then
knd:=1129+10000*(nnd div 10000);
WHILE nnd>10000*GG+NPD[iu] do begin inc(iu); if iu=53 then
begin inc(GG);While not(PPR(GG)) do inc(GG);iu:=1; end; end;
WHILE knd<10000*GGk+NPD[ju] do begin Dec(ju);if ju=0 then
begin Dec(GGk);While Not(PPR(GGk)) do Dec(GGk);ju:=52; end; end;
nnd:=10000*GG+NPD[iu]; knd:=10000*GGk+NPD[ju];
KPG:=0; i:=1; WHILE nnd<knd+1 do begin TTD[i]:=nnd;
if FKD(TTD[1],TTD[i])<ZZ then Begin
for k:=1 to i-1 do if PPR(FKD(TTD[k],nnd)) then inc(KPG);
inc(i);inc(iu);if iu=53 then begin iu:=1;inc(GG);
WHILE Not(PPR(GG)) do inc(GG);end;
nnd:=10000*GG+NPD[iu]; end else begin n0:=1;
While FKD(TTD[n0],nnd)>=ZZ do inc(n0);
for k:=1 to i-n0+1 do TTD[k]:=TTD[k+n0-1];
i:=i+1-n0;n0:=1;end;end;
WRITELN(KPG);
END.
PROGRAM Zadaha59;
Const MM=50000;
VAR I,N,K,Z:Longint;
- 76 -
MK:ARRAY[0..50000] OF boolean;
Begin
READLN(N,K);
for I:=0 to MM do MK[I]:=False;
MK[K]:=True;
for I:=2 to N-1 do BEGIN
if N mod I = 0 Then begin
if K>I then begin MK[K-I]:=True;
MK[K+1-2*(K mod I)]:=True; end;
if K+I<=N then begin MK[K+I]:=True;
if K mod I<>0 Then
MK[K+1+2*(I- K mod I)]:=True
else MK[K+1]:=True; end;
if K mod I<>1 then MK[K-1]:=True;
if K mod I<>0 then MK[K+1]:=True; end; END;
Z:=0;
For I:=1 to N do
if MK[I] then inc(Z);
Writeln(N-Z);
end.
PROGRAM Zadaha60;
const nm=100;
VAR K,i,j,ii,t,lr,pr,pr1,s:longint;
M:array[1..nm] of byte;
Procedure UMN;
begin pr:=0;
for ii:=1 to lr do begin pr1:=(2*M[ii]+pr) div 10;
M[ii]:=(2*M[ii]+pr) mod 10; pr:=pr1; end;
if pr>0 then begin M[lr+1]:=pr; inc(lr);end;
end;
Begin READLN(K); s:=0;
for i:=1 to K do begin
for j:=1 to K do begin
Read(t); if (i<=j)and(t=1) then inc(s); end;
Readln; end;
for i:=1 to nm do M[i]:=0; lr:=1; M[1]:=1;
for i:=1 to s do UMN; M[1]:=M[1]-1;
for i:=lr downto 1 do Write(M[i]:1); Writeln;
END.
Program Zadaha61;
VAR st,HBB,HMB,HRB,sl1,sl2,sum,svs:string;
i,tt:integer; PV:boolean;
procedure REHEN(mm:integer);
var i1,j1,k1,WW:integer;
d,c,b:array[0..9] of integer;
procedure prov;
var i2:integer;KR1:boolean;
ss1,ss2,res:longint;
Begin ss1:=0;ss2:=0;res:=0;
for i2:=1 to length(sl1) do ss1:=ss1*10+c[pos(sl1[i2],HRB)];
for i2:=1 to length(sl2) do ss2:=ss2*10+c[pos(sl2[i2],HRB)];
for i2:=1 to length(sum) do res:=res*10+c[pos(sum[i2],HRB)];
- 77 -
STR(ss1,svs); KR1:= (length(sl1)=length(svs));
STR(ss2,svs); KR1:=(KR1) and (length(sl2)=length(svs));
STR(res,svs); KR1:=(KR1) and (length(sum)=length(svs));
if (ss1+ss2=res)and(KR1) then
begin if PV then writeln(res,'=',ss1,'+',ss2) else
writeln(ss1,'+',ss2,'=',res); end;
end;
procedure per(nn:integer);
var ii,jj,kk,dd:integer;
p,r:array[0..10] of integer;
Begin
for ii:=0 to nn do p[ii]:=ii;
Repeat for ii:=1 to nn do c[ii]:=d[p[ii]];
prov;
for ii:=1 to nn do p[ii]:=p[ii]; jj:=nn;
while p[jj-1]>=p[jj] do dec(jj); kk:=nn;
while p[jj-1]>=p[kk] do dec(kk);
dd:=p[jj-1]; p[jj-1]:=p[kk];p[kk]:=dd;
for ii:=jj to nn do r[ii]:=p[nn-ii+jj];
for ii:=jj to nn do p[ii]:=r[ii];
until p[0]<>0;
End;
Begin WW:=10;
for i1:=1 to mm do b[i1]:=i1;
repeat
for i1:=1 to mm do d[i1]:=b[i1]-1;per(mm);
for i1:=1 to mm do b[i1]:=b[i1]; j1:=mm;
while (j1>0) and (b[j1]>=WW+j1-mm) do dec(j1);
if j1<>0 then begin inc(b[j1]) ;
for k1:=j1+1 to mm do b[k1]:=b[k1-1]+1;
end;
until j1=0;
End;
BEGIN PV:=FALSE; readln(st);
HBB:='ABCDEFGHJIKLMNOPRSTQUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩ
ЬЫЪЭЮЯ';
HMB:='abcdefghjiklmnoprstquvwxyzабвгдеёжзийклмнопрстуфхцчшщьыъэюя';
if pos('+',st)>pos('=',st) then begin PV:=True;
st:=copy(st,pos('=',st)+1,length(st)-pos('=',st))+'='+copy(st,1,pos('=',st)-1);
end; i:=1; while i<=length(st) do if st[i]=' ' then delete(st,i,1) else inc(i);
for i:=1 to length(st) do
if (st[i]<>'=') and (st[i]<>'+') then begin
insert(copy(HBB,pos(st[i],HBB)+pos(st[i],HMB),1),st,i);delete(st,i+1,1);end;
HRB:=st[1];
for i:=2 to length(st) do
if (st[i]<>'=') and (st[i]<>'+') and (pos(st[i],HRB)=0) then HRB:=HRB+st[i];
sl1:=copy(st,1,pos('+',st)-1);
sum:=copy(st,pos('=',st)+1,length(st)-pos('=',st));
sl2:=copy(st,pos('+',st)+1,pos('=',st)-pos('+',st)-1);
{Writeln( sl1,'+',sl2,'=',sum);}
if length(sl1)>length(sl2) then tt:=length(sum)-length(sl1)
else tt:=length(sum)-length(sl2);
- 78 -
if (length(HRB)>10) or (tt<0) or(tt>1) then WRITELN('NO')
else REHEN(length(HRB)) ;
END.
program Zadaha62;
const Nm=15000;
var H,X,Z,Z1,Z2:longint;
TP:array[1..Nm] of longint;St:string;
Procedure InitTP(ZMP:longint);
Var ii,kk,cc:longint;
Begin TP[1]:=2; TP[2]:=3; ii:=3; cc:=5;
if ZMP<100 then ZMP:=103;
While cc<=ZMP do begin kk:=1;
While (cc mod TP[kk]<>0)and(TP[kk]<=sqrt(cc)) do inc(kk);
if TP[kk]>sqrt(cc) then begin Tp[ii]:=cc; inc(ii);end;
inc(cc); end;
End;
function Pr(Ph:longint):boolean;
var up:longint;
begin Pr:=False; if Ph>1 then begin up:=1;
WHILE (Ph mod TP[up] <> 0) and (sqrt(Ph)>=TP[up]) do inc(up);
if TP[up]>sqrt(Ph) then Pr:=True;end;
end;
function MPr(Hst:string):longint;
Var i,q:word; P:boolean; R1,S:string;
begin i:=length(Hst); P:=True; R1:='0';
While (P)and(i>0) do
case Hst[i] of
'1','3','7','9': P:=False;
else begin
case Hst[i] of
'2','3','5','7': if R1<Hst[i] then R1:=Hst[i] ;
end; Delete(Hst,i,1); Dec(i); end;
end;
case Length(Hst) of
0,1: begin Val(R1,Z2,q); MPr:=Z2; end;
else begin Val(Hst,X,q); if Pr(X) then MPr:=X else
begin for i:=1 to length(Hst) do begin
S:=Hst; Delete(S,i,1); Z1:=MPr(S);
if Z1>Z Then Z:=Z1; end; MPr:=Z;
end;
end;
end;
end;
BEGIN
Readln(H);InitTP( 1+Trunc(sqrt(H)));
If Pr(H) then Writeln(H) else begin
STR(H,St); WRITELN(MPr(St)); end;
end.
PROGRAM Zadaha63;
Var AR,BR:string; AA,BA,m:word;
Function RVA(SH:string):word;
VAR i,H:integer; A:array[0..20] of integer;
- 79 -
BEGIN a[0]:=0;
for i:=1 to length(SH) do
case SH[i] of
'I': A[i]:=1;
'V': A[i]:=5;
'X': A[i]:=10;
'L': A[i]:=50;
'C': A[i]:=100;
'D': A[i]:=500;
'M': A[i]:=1000;
else A[0]:=1
end;
H:=A[length(SH)];
for i:=1 to length(SH)-1 do
if A[i]<A[i+1] then dec(H,A[i]) else inc(H,A[i]);
if A[0]=1 then RVA:=9999 else RVA:=H;
END;
Function AVR(F:word):string;
VAR HS:string;
BEGIN HS:='';
While F>0 do
case F of
1000..3999: Begin F:=F-1000; HS:=HS+'M'; end;
900..999: Begin F:=F-900; HS:=HS+'CM'; end;
500..899: Begin F:=F-500; HS:=HS+'D'; end;
400..499: Begin F:=F-400; HS:=HS+'CD'; end;
100..399: Begin F:=F-100; HS:=HS+'C'; end;
90..99: Begin F:=F-90; HS:=HS+'XC'; end;
50..89: Begin F:=F-50; HS:=HS+'L'; end;
40..49: Begin F:=F-40; HS:=HS+'XL'; end;
10..39: Begin F:=F-10; HS:=HS+'X'; end;
9..9: Begin F:=F-9; HS:=HS+'IX'; end;
5..8: Begin F:=F-5; HS:=HS+'V'; end;
4..4: Begin F:=F-4; HS:=HS+'IV'; end;
1..3: Begin F:=F-1; HS:=HS+'I'; end;
end;
AVR:=HS;
END;
Begin READLN(AR); READLN(BR);
For m:=1 to length(BR) do if BR[m]=' ' then Delete(BR,m,1);
For m:=1 to length(AR) do if AR[m]=' ' then Delete(AR,m,1);
AA:=RVA(AR); BA:=RVA(BR);
if (BA mod AA<>0) then Writeln('NO') else
Writeln(AVR((BA div AA)));
END.
PROGRAM Zadaha64;
VAR a,b,c,d:longint;
function NOD(n,m:longint):longint;
begin while (n<>0) and (m<>0) do begin
if n>m then n:=n mod m else m:=m mod n;end;NOD:=m+n;
end;
BEGIN
READLN(a,b,c,d);
- 80 -
WRITELN((c+d-NOD(c,d)):11);
END.
program Zadaha65;
var x:longint;
G,M,R:word;
function PGB(a,b:word):word; (* ФУНКЦИЯ PGB ВЫЧИСЛЯЕТ ЧИСЛО*)
var S:word;
(* ГЛАСНЫХ БУКВ В НАПИСАНИИ *)
function ED(c:word):word; (* ТРЕЗНАЧНОГО ЧИСЛА а b-ГО *)
var w:word;
(* РАЗРЯДА В ЧИСЛЕ х
*)
begin w:=1; case c of
0: w:=w-1;
1: w:=w+1;
4: w:=w+2;
8..9: w:=w+1;
end; ED:=w;
end;
Begin S:=b;
case b of
1:S:=0;
2:if ((a mod 100) div 10<>1)and(a mod 10<5)and(a mod 10>0) then S:=S+1;
3:if not((a mod 100<>11)and( a mod 10 = 1)) then S:=S+1;
4:if (a mod 100<>11)and( a mod 10 = 1)
then S:=S-1;
end;
if a=0 then S:=0 else begin
case (a div 100) of
0: S:=S;
1: S:=S+1;
4: S:=S+4;
8..9: S:=S+3;
else S:=S+2;
end;
case ((a mod 100) div 10) of
0: S:=S+ED(a mod 10);
1: begin S:=S+4;
case (a mod 10) of
0: S:=S-2;
2..3: S:=S-1;
5..7: S:=S-1;
end;
end;
2..4: S:=S+2+ED(a mod 10);
5..7: S:=S+3+ED(a mod 10);
8..9: S:=S+4+ED(a mod 10);
end;
end;
PGB:=S;
End;
BEGIN
readln(x); R:=0; G:=0;
if x<0 then begin x:=abs(x); G:=2; end;
if x=0 then G:=1 else
WHILE x<>0 do begin
M:=x mod 1000; x:=x div 1000;
- 81 -
R:=R+1; G:=G+PGB(M,R);
end;
WRITELN(G:5);
end.
Program Zadaha66;
VAR
i,j:integer; MR,VM:real; nW,im:byte;
d,c,b:array[1..4] of integer;
Function L18(x:real):real;
Begin if x<=0 then L18:=-1500000000 else
L18:=(1/Ln(1.8))*Ln(x);
end;
procedure MaPr(Var zz:byte;Var PMR:real);
var Pz:real;
Begin zz:=8;
PMR:=L18(L18(1000*c[1]+100*c[2]+10*c[3]+c[4]));
if c[3]<>0 then begin
Pz:=exp(c[4]*Ln(c[3]))*L18(c[2])+L18(L18(c[1]));
if Pz>PMR then begin zz:=1; PMR:=Pz; end; end;
Pz:=(10*c[3]+c[4])*L18(c[2])+L18(L18(c[1]));
if Pz>PMR then begin zz:=2; PMR:=Pz; end;
Pz:=c[4]*L18(10*c[2]+c[3])+L18(L18(c[1]));
if Pz>PMR then begin zz:=3; PMR:=Pz; end;
Pz:=c[4]*L18(c[3])+L18(L18(10*c[1]+c[2]));
if Pz>PMR then begin zz:=4; PMR:=Pz; end;
Pz:=L18(100*c[2]+10*c[3]+c[4])+L18(L18(c[1]));
if Pz>PMR then begin zz:=5; PMR:=Pz; end;
Pz:=L18(L18(100*c[1]+10*c[2]+c[3]))+L18(c[4]);
if Pz>PMR then begin zz:=6; PMR:=Pz; end;
Pz:=L18(L18(10*c[1]+c[2]))+L18(10*c[3]+c[4]);
if Pz>PMR then begin zz:=7; PMR:=Pz; end;
end;
procedure Rehen;
var ii,jj,kk,dd,nn:integer;
p,r:array[0..4] of integer;
Begin nn:=4;
for ii:=0 to nn do p[ii]:=ii;
Repeat for ii:=1 to nn do c[ii]:=d[p[ii]];
MaPr(nW,VM); if VM>MR then begin im:=nW;
MR:=VM; for j:=1 to 4 do b[j]:=c[j]; end;
for ii:=1 to nn do p[ii]:=p[ii]; jj:=nn;
while p[jj-1]>=p[jj] do dec(jj); kk:=nn;
while p[jj-1]>=p[kk] do dec(kk);
dd:=p[jj-1]; p[jj-1]:=p[kk];p[kk]:=dd;
for ii:=jj to nn do r[ii]:=p[nn-ii+jj];
for ii:=jj to nn do p[ii]:=r[ii];
until p[0]<>0;
End;
procedure WYWOD;
Begin
case im of
1: Writeln(b[1],'^',b[2],'^',b[3],'^',b[4]);
2: Writeln(b[1],'^',b[2],'^',10*b[3]+b[4]);
- 82 -
3: Writeln(b[1],'^',10*b[2]+b[3],'^',b[4]);
4: Writeln(10*b[1]+b[2],'^',b[3],'^',b[4]);
5: Writeln(b[1],'^',100*b[2]+10*b[3]+b[4]);
6: Writeln(100*b[1]+10*b[2]+b[3],'^',b[4]);
7: Writeln(10*b[1]+b[2],'^',10*b[3]+b[4]);
8: Writeln(1000*b[1]+100*b[2]+10*b[3]+b[4]);
end;
End;
Begin nW:=8; MR:=-2000000000;
for i:=1 to 4 do read(d[i]); readln;
Rehen; WYWOD;
END.
Program Zadaha67;
const kv=20;
var T: array [0..kv,0..kv] of longint ;
MI,MJ: array [0..kv] of real;
i,j,k,p,u:word; Z,Y,c,d,X,W: real;
Begin
readln(Y,Z,p); c:=1-p/100; d:=1+p/100; MI[0]:=1;
k:=0; u:=0; X:=Z/Y; W:=abs(X-1);
MJ[0]:=1;
for j:=1 to kv do begin MJ[j]:=c*MJ[j-1];
MI[j]:=d*MI[j-1]; end;
for i:=1 to kv do
for j:=1 to kv do
if (i+j<kv+1)and(abs(X-MI[i]*MJ[j])<W) then begin
W:=abs(X-MI[i]*MJ[j]); k:=i; u:=j; end;
for i:=0 to k do T[i,0]:=1;
for j:=0 to u do T[0,j]:=1;
for i:=1 to k do
for j:=1 to u do T[i,j]:=(T[i,j-1]*(i+j)) div j ;
Writeln(T[k,u]);
end.
Program Zadaha68;
Const Km=30;
Var D: array [1..Km] of real;
i,j,N,K:longint; S,M:real;
Begin
readln(N,M,K); S:=K*M;
for i:=1 to K do D[i]:=M;
for i:=K downto 1 do Begin
D[i]:=D[i]+(S-D[i])/2;
for j:=1 to K do if i<>j then D[j]:=D[j]/2;
end;
Writeln(D[N]:15:2);end.
PROGRAM Zadaha69;
VAR a,b,c,d,f:longint;
function NOD(n,m:longint):longint;
begin while (n<>0) and (m<>0) do begin
- 83 -
if n>m then n:=n mod m else m:=m mod n;end;NOD:=m+n;
end;
BEGIN
READLN(a,b,c);
d:=NOD(a,b)+NOD(a,c)+NOD(b,c);
f:=NOD(a,b);
if f<NOD(a,c) then f:=NOD(a,c);
if f<NOD(b,c) then f:=NOD(b,c);
WRITELN((a+b+c-d+f):11);
END.
PROGRAM Zadaha70;
const z=255;
type DH=array[1..z] of byte;
var i,j,N:integer; SL1,SL2:DH;
PROCEDURE SUM(MD1,MD2:DH; var RMU:DH);
Var mi:byte;Per:longint;
begin Per:=0;for mi:=1 to z do begin
RMU[mi]:=(MD1[mi]+MD2[mi]+Per) mod 10;
Per:=(MD1[mi]+MD2[mi]+Per) div 10;
end;end;
PROCEDURE ZERO(var VV:DH);
Var m1:byte;
begin for m1:=1 to z do VV[m1]:=0;end;
PROCEDURE WYWOD(var WV:DH);
Var ii:integer;
Begin
ii:=z; While (WV[ii]=0)and(ii>0) do Dec(ii);
if ii=0 then writeln(0) else begin
While ii>0 do begin write(WV[ii]:1); Dec(ii);end;
write(' ');
end;
end;
BEGIN
readln(N);
ZERO(SL1); ZERO(SL2); SL1[1]:=1; SL2[1]:=1;
for i:=1 to N div 2 do begin
SUM(SL1,SL2,SL1); SUM(SL1,SL2,SL2); end;
if (N mod 2 = 1) then begin SUM(SL1,SL2,SL1);
WYWOD(SL2);WYWOD(SL1);end else
begin WYWOD(SL1);WYWOD(SL2); end; Writeln;
end.
- 84 -
Download