e-olymp 9104. Плоская земля

Условие

Система образования Вас снова подвела — Ваше предложение о включении модели «Плоская Земля» в программу старшей школы было отклонено в шестой раз подряд. Коррумпированные ученые Круглой Земли отказываются прислушиваться к Вашим аргументам и игнорируют кучу данных, подтверждающих Ваши заявления.

Настало время урегулировать этот конфликт раз и навсегда. Вы путешествовали по всему земному шару и встречались с ведущими учеными Плоской Земли. Вместе Вы разработали блестящий план.

Ради противоречия предположим, что Земля — это сфера в трехмерном пространстве. Тогда, если предположить, что небо является бесконечной плоскостью в пространстве, такая Земля явно бросит на него тень! Эта тень была бы ортогональной проекцией Земли на небо. Поскольку в действительности на небе нет видимой тени, мы достигаем противоречия.

Осталось только выполнить расчеты. По заданным центру и радиусу Земли, а также уравнению небесной плоскости в виде [latex]ax + by + cz + d = 0[/latex] необходимо определить площадь ортогональной проекции Земли на небо. Обратите внимание, что в некоторых Ваших экспериментах Земля может пересекать небо — Вы не хотели бы вводить слишком много ненужных предположений, не так ли?

Входные данные

Первая строка содержит количество тестов [latex]n[/latex] [latex]\left(1\leqslant n\leqslant 10\right)[/latex]. Далее следует описание тестов.

Каждый тест описывается строкой, содержащей восемь целых чисел [latex] x, y, z, r, a, b, c, d [/latex]. Они обозначают координаты центра Земли, его радиус и уравнение неба соответственно. Все числа от [latex]1[/latex] до [latex]1000[/latex] включительно.

Выходные данные

Для каждого теста выведите одно число: площадь проекции с не менее [latex]6[/latex] десятичными цифрами.

Тесты

Входные данные Выходные данные
1 1
2 3 5 7 1 2 4 8
153.938040026
2 2
2 3 5 7 1 2 4 8
4 5 3 9 2 6 8 10
153.938040026
254.469004941
3 3
2 3 5 7 1 2 4 8
4 5 3 9 2 6 8 10
23 45 87 8 100 200 65 89
153.938040026
254.469004941
201.06192983

Код программы

Решение

Для начала, определимся, чего от нас хотят авторы задачи.  По сути, самой важной частью условия является третий абзац, из которого мы узнаем, что Земля — сфера, а также, что ортогональная проекция Земли на небо — это тень от Земли на небесную плоскость. Но, если существует тень, значит существует и светило (Солнце). Для того, что бы стало более понятно, проведём эксперимент. Представим, что Земля — это сфера, Солнце — это настольная лампа (Важно! Лампа будет давать параллельный пучок лучей), а небесная плоскость — это обычный лист бумаги. (Важно! В данном эксперименте размеры светила и размеры «Земли» будут совпадать). При направлении света на сферу, на лист бумаги будет отбрасываться тень (площадь которой нам и надо найти). Итак, как мы видим на рисунке, площадь проекции — это ничто иное, как площадь сечения сферы, проходящее по центральной оси этой сферы. А площадь сечения сферы по центральной оси — это площадь круга, которая вычисляется по формуле [latex]S=\pi r^2[/latex]. Таким образом, что бы рассчитать площадь проекции, из всех входящих данных нам понадобится только радиус Земли. Что бы у нас было число [latex]\pi[/latex], мы воспользуемся классом Math.

e-olymp 6261. Устройство для анализа бюллетеня

Задача

Избирательная комиссия Флатландии готовится к президентским выборам. Чтобы свести к минимуму человеческий фактор при подсчете голосов, они решили разработать автоматическое устройство для анализа бюллетеней (УАБ).

На пост президента баллотируются $n$ кандидатов. Бюллетень содержит одно квадратное поле для каждого кандидата. Избиратель должен отметить ровно одно из полей. Если поле не помечено или имеется два или более отмеченных поля, бюллетень недействителен. Каждый избиратель ставит свой бюллетень на специальный сканер в УАБ. Сканер анализирует отметки в бюллетене и создает специальную строку голосования из $n$ символов: ‘X’ для отмеченного поля и ‘.’ для немаркированного. Теперь строки голосования должны быть проанализированы, чтобы получить отчет. Ваша задача — разработать генератор отчетов для УАБ.

С учетом строк голосования для всех бюллетеней Ваша программа должна распечатать отчет о голосовании. Кандидаты в протоколе должны быть расположены в порядке убывания количества голосов. Если два кандидата имеют одинаковое количество голосов, они должны иметь тот же порядок, что и в бюллетене для голосования. Для каждого кандидата рассчитайте его / ее результат в процентах (если кандидат получил $p$ голосов, результат в процентах составляет $\frac{100 \cdot p}{m}$ ). В последней строке отчета должен быть указан процент недействительных бюллетеней.

Входные данные

Первая строка содержит два целых числа $n$ и $m (2 \leqslant n \leqslant 10, 1 \leqslant m \leqslant 1000$) — количество кандидатов и количество бюллетеней. Следующие $n$ строк содержат фамилии кандидатов. Каждое имя представляет собой строку не более $100$ английских букв. Нет ни одного кандидата с именем «Invalid».

Затем следуют $m$ строк, каждая из которых содержит одну строку голосования.

Выходные данные

Выведите $n+1$ строк. Сначала выведите результаты для кандидатов в процентах. Для каждого кандидата выведите его / ее фамилию, затем пробел, а затем его / ее результат в процентах и знак процента ‘$\%$’. В последней строке должен быть указан процент недействительных бюллетеней: слово «Invalid», за которым следуют пробел, процент недействительных бюллетеней и знак процента.

Округлите все числа до двух цифр после десятичной точки. Если число находится точно посередине двух представимых чисел, выведите большее (например, выведите $«12.35»$ для $12.345$).

Тесты

Входные данные

Выходные данные

1 4 7
Loudy
Apples
Dogman
Miller
.X..
X…
….
..X.
..XX
..X.
..X.
Dogman 42.86%
Loudy 14.29%
Apples 14.29%
Miller 0.00%
Invalid 28.57%
2 4 10
Loudy
Apples
Dogman
Miller
X………………..
X…………………..
X………………
X………………….
X…………..
x………………………..
X……………….
X……………
X..x
xxxx
Loudy 70.00%
Apples 0.00%
Dogman 0.00%
Miller 0.00%
Invalid 30.00%

Код программы

 

Решение

Чтобы решить задачу создадим структуру с именами и результатами кандидатов. Сначала создадим массив кандидатов и заполним его. По вводу бюллетеней будем проверять не испорчены ли они. Если кроме «X» есть любой другой символ, или буква, или еще символы «X», то бюллетень испорчен, в остальных случаях он не испорчен. Если он не испорчен, добавляем к результату кандидата единицу, если нет — добавляем к счетчику испорченых бюллетеней единицу. Выводим в процентном соотношении с количеством бюллетеней результат каждого кандидата и количество испорченых бюллетеней.

Ссылки

Условие задачи на e-olymp

Код программы на ideone

e-olymp 4142. Большой XOR

Задача

Для заданного целого $x$ найти количество таких $a$, удовлетворяющих условию:

  • $ a $ xor $x > x $
  • $ 0 < a < x $

где $a$ и $x$ — целые, xor — битовый XOR оператор.

Имеются $q$ запросов, каждый из которых содержит целое число $x$. Для каждого запроса выведите общее количество значений $a$, удовлетворяющих условиям выше.

Входные данные

Первая строка содержит число запросов $q$ $(1 \leqslant q \leqslant 10^5)$. Каждая из следующих $q$ строк содержит значение $x$ $(1 \leqslant x \leqslant 10^{10})$.

Выходные данные

Для каждого теста выведите в отдельной строке количество значений $a$, удовлетворяющих приведенным условиям.

Тесты

Входные данные Выходные данные
1 2
2
10
1
5
2 3
13
3
16
2
0
15
3 5
1
7
4294967295
42
451
0
0
0
21
60

Код

Решение

XOR выдаёт число, биты которого равны $1$, когда лишь у одного из чисел соответствующий бит равен $1$. Числа большие чем $x$ получаем лишь тогда, когда $2^{k}\leqslant a<2^{k+1}$, где $k$- номер бита числа $x$, который равен нулю. Таких $a$ существует $2^k$ штук для каждого такого бита.

  • Задача на e-olymp
  • Код программы на ideone
  • Засчитанное решение
  • e-olymp 419. Задача 3n + 1

    Задача

    Рассмотрим следующий алгоритм генерации последовательности чисел:

    Например, для [latex]n = 22[/latex] будет сгенерирована следующая последовательность чисел:

    22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

    Полагают (но это еще не доказано), что этот алгоритм сойдется к [latex]n = 1[/latex] для любого целого [latex]n[/latex]. По крайней мере, это предположение верно для всех целых [latex]n[/latex], для которых [latex]0 < n < 1,000,000[/latex].
    Длиной цикла числа [latex]n[/latex] будем называть количество сгенерированных чисел в последовательности включая [latex]1[/latex]. В приведенном примере длина цикла числа [latex]22[/latex] равна [latex]16[/latex].
    Для двух заданных чисел [latex]i[/latex] и [latex]j[/latex] необходимо найти максимальную длину цикла среди всех чисел между [latex]i[/latex] и [latex]j[/latex] включительно.

    Входные данные

    Каждый тест задается в отдельной строке и содержит пару целых чисел [latex]i[/latex] и [latex]j[/latex]. Входные числа будут меньше [latex]1000000[/latex] и больше [latex]0[/latex]. Считайте, что для вычислений достаточно использовать [latex]32[/latex] битный целочисленный тип.

    Выходные данные

    Для каждой пары чисел [latex]i[/latex] и [latex]j[/latex] выведите числа [latex]i[/latex] и [latex]j[/latex] в том же порядке, в каком они поступили на вход. После чего выведите максимальную длину цикла среди всех целых чисел между [latex]i[/latex] и [latex]j[/latex] включительно. Для каждого теста три числа следует выводить в отдельной строке, разделяя одним пробелом.

    Тесты

    Входные данные Выходные данные
    1 10
    100 200
    201 210
    900 1000
    1 10 20
    100 200 125
    201 210 89
    900 1000 174
    1 10
    10 1
    1 10 20
    10 1 20
    5 25
    70 54
    38 250
    5 25 24
    70 54 113
    38 250 128

    Код программы

    Решение

    Алгоритм, описанный в условии задачи используется для построения сиракузской последовательности. Интересный факт — какое бы число не взять, в конце получаем единицу. Нам же надо посчитать сколько раз должен сработать алгоритм для подсчитывания «длины цикла». Считывая пару чисел из потока ввода я высчитывал «длину цикла» для каждого числа из заданного введенной парой промежутка. После чего сравнивал количество итераций для каждого такого числа и находил максимальное. И так для каждой пары чисел.

    Ссылки

    Ссылка на e-olymp.
    Ссылка на Ideone

    e-olymp 3843. Простые

    Задача

    Пусть $m$ и $n$ $\left(2 ≤ m < n ≤ 107\right)$ — целые числа. Рассмотрим следующее множество:

    Prime $\left(m, n\right) = \lbrace{ p | p\;простое, m ≤ p ≤ n \rbrace}$.

    Вычислить мощность множества Prime$\left(m, n\right)$.

    Входные данные

    Состоит из нескольких тестов. Два последовательных теста разделены пустой строкой. Для каждого теста в отдельной строке заданы числа $m$ и $n$.

    Выходные данные

    Для каждого теста вывести результат в отдельной строке. Результаты соседних тестов разделять пустой строкой. Для каждого теста вывести мощность множества Prime$\left(m, n\right)$.

    Тесты

    Входные данные Выходные данные
    2 20

    70 110

    5 150

    8

    10

    33

    7 2056

    14 181

    27 367

    307

    36

    64

    77 777

    55 555

    33 333

    116

    85

    56

    Код решения

    Решение

    Для решения этой задачи требуется завести большой массив типа bool и присвоить ему значение true. Затем проверяется, простое ли число, если это не так, то присваиваем значение false.
    Затем нужно последовательно сосчитать мощность каждого множества простых чисел, то есть количество простых чисел от n до m, с помощью массива-счётчика: записывается в него прошлые и последующие элементы множества простых чисел.
    После этого в цикле задаются нужные значения, считается ответ и выводится.

    Ссылки

    Ссылка на E-olymp
    Ссылка на решение

    e-olymp 176. Выбор вождя

    Условие задачи
    Орки – одна из рас, населяющих мир Драэнор. Не отличаясь высоким интелектом, орки все же славятся своею силой и отвагой в бою. Ежегодно орки из разных кланов собираются в Долине Силы для того, чтобы избрать вождя всей Орды. В отличие от глупых людей, орки презирают выборы посредством голосования (да и, скажем прямо, все эти бюлетени, урны и избирательные участки чужды и непонятны орку, не державшему в руках ничего, кроме дубины и топора). Кандидаты в вожди сражаются друг с другом в честных поединках. В каждом поединке участвуют два претендента, один из которых выходит из него победителем, а другой оказывается поверженным. Проигравший в одном поединке орк выбывает из числа претендентов и не может участвовать в последующих поединках. Оставшийся в конце концов после всех боев кандидат и становит вождем Орды.

    Старейшины орков всегда наблюдают за выборами и любят предугадывать кто победит на них. Однако далеко не всегда можно предсказать не то, что общую победу на выборах, но даже победителя в одном конкретном бою. Конечно же все зависит от силы сражающихся – кто сильнее, тот и победит, однако в случае равенства сил может победить любой из них – тут уж как звезды станут.

    Старейшины обратились к вам с просьбой написать программу для определения количества претендентов, которые могут стать вождями.
    Входные данные
    В первой строке входного файла записано количество $N$ претендентов на звание вождя в этом году $(1 ≤ N ≤ 1000000)$, а во второй – $N$ целых чисел в пределах от $1$ до $10000$, каждое из которых определяет силу соответствующего кандидата.
    Выходные данные
    Выходной файл должен содержать одно число – количество претендентов, которые могут стать вождями.
    Тесты

    Входные данные Выходные данные
    5
    1 2 3 4 5
    1
    6
    2 2 2 2 2 2
    6
    6
    3 2 1 3 1 1
    2

    Код программы

    Решение задачи
    Так как задача на потоковую обработку создаем цикл, который работает пока у нас вводится число «Сила Орков». В самом цикле происходит следующее:

    1. Если «Сила Орков» больше max, то мы в переменную max присваиваем значение из «Силы Орков» и счетчику присваиваем единицу.
    2. Если «Сила Орков» равна max то мы прибавляем к счетчику $1$.

    Выводим счетчик на экран.
    Ссылки
    Задача на сайте e-olymp
    Код решения в Ideone

    e-olymp 992. Города и дороги

    Задача

    В галактике «Milky Way» на планете «Neptune» есть n городов, некоторые из которых соединены дорогами. Император «Maximus» галактики «Milky Way» решил провести инвентаризацию дорог на планете «Neptune». Но, как оказалось, он не силен в математике, поэтому он просит Вас сосчитать количество дорог.

    Вводные данные

    В первой строке записано число $n$ $(0 \leq n \leq 100)$. В следующих $n$ строках записано по $n$ чисел, каждое из которых является единичкой или ноликом. Причем, если в позиции $(i, j)$ квадратной матрицы стоит единичка, то $i$-ый и $j$-ый города соединены дорогами, а если нолик, то не соединены.

    Выходные данные

    Вывести одно число — количество дорог на планете «Neptune».

    Тесты

    Входные данные Выходные данные
    $3$
    $0$ $1$ $1$
    $1$ $0$ $1$
    $1$ $1$ $0$
    $3$
    $3$
    $0$ $1$ $0$
    $1$ $0$ $0$
    $0$ $0$ $0$
    $1$
    $5$
    $0$ $1$ $0$ $1$ $1$
    $1$ $0$ $0$ $0$ $0$
    $0$ $0$ $0$ $0$ $0$
    $1$ $0$ $0$ $0$ $0$
    $1$ $0$ $0$ $0$ $0$
    $3$

    Код программы(использование матрицы смежности)

    Решение задачи(использование матрицы смежности)

    Для решения задачи вводим матрицу смежности. Далее в цикле проходим верхнюю треугольную часть матрицы смежности и если попадается $1$, то увеличиваем число дорог на $1$. Выводим количество дорог. Задача решена.

    Код программы(потоковая обработка)

    Решение задачи(потоковая обработка)

    Для решения задачи вводим числа пока они вводятся. Поскольку дороги идут с одного города в другой и наоборот, то их количество будет равно половине единичек в матрице смежности, то есть половине единичек входящих во входной поток. Cчитаем их количество и делим на $2$. Выводим количество дорог. Задача решена.

    Ссылки

    Условие задачи на e-olymp
    Код решения на ideone.com(матрица смежности)
    Код решения на ideone.com(потоковая обработка)

    e-olymp 97. Числа Белла

    Задача

    Bell
    Число Белла $B_n$ равно количеству разбиений множества из $n$ элементов на произвольное количество непересекающихся непустых подмножеств. Например, $B_3 = 5$, так как существует $5$ возможных разбиений множества $\lbrace a, b, c\rbrace$: $\lbrace\lbrace a\rbrace, \lbrace b\rbrace, \lbrace c\rbrace\rbrace, \lbrace\lbrace a, b\rbrace, \lbrace c\rbrace\rbrace, \lbrace\lbrace a, c\rbrace, \lbrace b\rbrace\rbrace, \lbrace\lbrace a\rbrace, \lbrace b, c\rbrace\rbrace, \lbrace\lbrace a, b, c\rbrace\rbrace$. Дополнительно считаем, что $B_0 = 1$.
    Рассмотрим определитель $D_n$:
    $$D_n = \begin{vmatrix}
    B_0& B_1& B_2&\ldots& B_n\\
    B_1& B_2& B_3&\ldots& B_{n+1}\\
    \ldots& \ldots& \ldots& \ldots& \ldots\\
    B_n& B_{n+1}& B_{n+2}&\ldots& B_{2n}
    \end{vmatrix}$$
    Для заданного простого числа $p$ найти наибольшее целое $k$, для которого $D_n$ делится на $p^k$.

    Входные данные

    Каждая строка ввода содержит два целых числа $n$ и $p$ ($0\leq\; n,\;p \;\leq\; 10000$). Известно, что $p$ – простое.

    Выходные данные

    Для каждой пары входных значений $n$ и $p$ в отдельной строке выведите наибольшее целое $k$, для которого $D_n$ делится на $p^k$.

    Тесты

    Входные данные Выходные данные
    1 5
    3 2
    4 2
    4 3
    10000 3
    0
    2
    5
    2
    24962375
    18 2
    465 1009
    9998 9221
    548 11
    134
    0
    778
    14412
    1093 1093
    1103 1723
    3931 617
    4868 6113
    9534 71
    1
    0
    10635
    0
    639989
    617 17
    42 11
    0 5
    11295
    63
    0

    Код программы

    Решение

    Числа Белла обладают интересным свойством:
    $$D_n = \begin{vmatrix}
    B_0& B_1& B_2&\ldots& B_n\\
    B_1& B_2& B_3&\ldots& B_{n+1}\\
    \ldots& \ldots& \ldots& \ldots& \ldots\\
    B_n& B_{n+1}& B_{n+2}&\ldots& B_{2n}
    \end{vmatrix} = \prod_{i=1}^n i!$$
    Воспользуемся этим свойством для решения данной задачи. Найдём степень числа $p$
    в разложении на простые множители. Для этого узнаем степень вхождения этого числа в каждый из факториалов. Суммой полученных значений и будет являться искомое число $k$.

    Ссылки

    Условие задачи на e-olymp
    Решение на ideone
    Решение на e-olymp
    Число Белла на wikipedia

    e-olymp 1000. Задача a + b

    Задача

    Вычислите сумму $a+b$.

    Входные данные

    В каждой строке задано два целых числа $a$ и $b$ $(|a|,|b| \leq 30000)$.

    Выходные данные

    Для каждого теста выведите сумму $a+b$ в отдельной строке.

    Тесты

    Входные данные Выходные данные
    $4$ $8$
    $5$ $0$
    $-6$ $8$
    $12$
    $5$
    $2$
    $-3$ $3$ $0$
    $12$ $8$
    $10$ $10$
    $20$
    $20$
    $30000$ $30000$
    $3000$ $3000$
    $300$ $300$
    $30$ $30$
    $3$ $3$
    $60000$
    $6000$
    $600$
    $60$
    $6$
    $10$ $23$
    $613$ $2$
    $-200$ $300$
    $33$
    $615$
    $100$

    Код программы

    Решение задачи

    Пока вводятся пары чисел, они считываются и на экран выводится их сумма.

    Ссылки

    Условие на e-olymp
    Решение на языке C++ с описанием решения
    Код на java

    e-olimp 7365

    Ссылка на оригинал задачи

    Задача «Молоко и пирожок»

    Ученикам первого класса дополнительно дают стакан молока и пирожок, если вес первоклассника менее 30 кг. В первых классах школы учится [latex]n[/latex] учеников. Стакан молока имеет емкость 200 мл, а упаковки молока – 0.9 л. Определить количество дополнительных пакетов молока и пирожков, необходимых каждый день.

    Тесты:

    Количество детей Вес Количество упаковок молока Количество пирожков
    3 30 29 30 1 1
    5 25 41 56 20 20 1 3
    4 30 30 30 30 0 0
    7 25 26 27 28 29 23 24 2 7

    Код:

    Алгоритм:

    1. Объявление и ввод значений переменных.
    2. Используем цикл for для подсчета необходимого количества пирожков.
    3. На основе предыдущих данных и округления в большую сторону (метод  Math.ceil ), подсчитываем необходимое количество пакетов молока.
    4. Окончание работы программы.

    Работающая версия программы на Ideone.com

    Ссылка на источник