e-olymp 1288. n-значные числа

Задача:

Сколько натуральных $n$ -значных чисел начинаются с цифры $a$ или цифры $b$?

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

Заданы три целых числа: натуральное $n$ [latex](0 \lt n \leqslant 10^6)[/latex] и целые $a$ и $b$. Все данные, как и само условие задачи, заданы в десятичной системе счисления.

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

Вывести количество натуральных $n$ -значных чисел, которые начинаются с цифры $a$ или цифры $b$.

Тесты:

ВВОД ВЫВОД
3 3 4  200
 1 2 2  1
 4 0 0  0
 10 9 9  1000000000

Код (Вариант 1):

Код (Вариант 2):

Решение:

Среди однозначных чисел с каждой цифры начинается только одно число.
Среди двухзначных чисел с одной цифры начинается уже десять чисел.
Среди трехзначных — сто и так далее. Легко заметить закономерность, что в количестве чисел, начинающихся с определенной цифры, единица всегда остается, а к ней приписывают $n-1$ нулей, где $n$ — количество разрядов.
Если мы ищем количество чисел начинающихся уже с двух разных цифр, то единица меняется на двойку, а количество нулей сохраняется.

Отсюда и решение задачи — последовательная проверка всех вариантов и вывод ответа.

P.S. Данное решение не проходит тесты 12-19 на сайте e-olymp. Это происходит из-за того, что в этих тестах результат — это число с большим количеством нулей, а язык Java тратит много времени на их вывод. То есть, тесты не выполняются только из-за времени работы. Решение этой задачи на языке С++ проходит без проблем все тесты.

Ссылки:

Задача на e-olymp
Решение №1 ideone
Решение №2 ideone

e-olymp 9405. Профессор и шары

Условие задачи

Для праздника Профессор купил голубые, красные и жёлтые воздушные шары. Всего $n$ штук. Жёлтых и голубых вместе — $a$. Красных и голубых — $b$ штук.

Сколько голубых, красных и жёлтых шаров купил Профессор?

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

Три натуральных числа $n$, $a$, $b$.

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

В одной строке выведите количество голубых, красных и жёлтых шаров, которые купил Профессор.

Тесты

Входные данные Выходные данные
1 10 6 8 4 4 2
2 12 8 10 6 4 2
3 14 10 12 8 4 2
4 16 14 12 10 2 4

Программный код

Решение

Для решения задачи необходимо вывести формулу для вычисления количества жёлтых ($y$), синих ($u$) и красных ($r$) шаров. Из условия имеем, что:

$$\left.\begin{matrix}
&u&+&y&=a&\\
&r&+&u&=b&\\
&r&+&u&+&y&=n&
\end{matrix}\right\}$$

Выразим $r$ и $y$ через $u$:

$$\left.\begin{matrix}
r=&b&-&u&\\
y=&a&-&u&
\end{matrix}\right\}$$

Подставим эти значения в формулу $r+u+y=n$:

$n=b-u+u+a-u$

$u$ и $-u$ взаимоуничтожатся и мы получим, что:

$n=a+b-u$

Теперь выведем формулу для вычисления количества синих шаров:

$u=b+a-n$

Ссылки

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 51. К-домино

    Задача

    ДоминоРаботник отдела технического контроля любил выбраковывать «доминошки», которые содержали одинаковые значения. Так как на предприятии, выпускающем [latex]K[/latex]-домино, этого не знали, к нему постоянно поступали претензии на сумму, равную стоимости [latex]K[/latex]-домино. Стоимость [latex]K[/latex]-домино составляла ровно столько гривен, сколько было в купленном покупателем наборе доминошек.Для того, чтобы его не уволили с работы, работник ОТК выбраковывал иногда не только все не любимые «доминошки», а несколько больше, но не более половины гарантированно выбраковыванных.Зная сумму претензии, пришедшей на предприятие, установите, какой из наборов [latex]K[/latex]-домино был куплен покупателем.

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

    Единственное число [latex]S[/latex] – сумма претензии, пришедшей на предприятие, [latex]S ≤ 2000000000[/latex].

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

    Единственное число – индекс [latex]K[/latex] купленного покупателем [latex]K[/latex]-домино.

    Входные данные Выходные данные
    1 5 3
    2 10 4
    3 1000000 1414
    4 555666777888 1054198
    5 13 5

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

    Решение

    [latex]K[/latex]-домино — набор домино с минимальным количеством точек на одной из половин доминошки.
    Количество дублей, то есть количество точно выбракованных доминошек — [latex]k[/latex]+1. Общее количество доминошек [latex]k[/latex]-домино:$$(k+1){{k+2}\over{2}}$$
    Пусть работник дополнительно выбраковывал [latex]e[/latex] доминошек. [latex]s[/latex] — сумма претензии, тогда имеем:

    [latex]k+1+e+s= (k+1){{k+2}\over{2}}[/latex]  
    [latex]k^2<=2s+1[/latex]  
    [latex]k=[\sqrt{2s+1}][/latex]

    Ссылки

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

    e-olymp 2. Цифры

    Задача

    Вычислить количество цифр целого неотрицательного числа $latex n$.

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

    Неотрицательное целое число [latex]n[/latex] [latex](0<=n<=2*10^9)[/latex].

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

    Количество цифр в числе $latex n$.

    Тесты

    n Количество цифр
    3 1
    327 3
    1024 4

    Решение

    Объявляем переменную x для подсчета цифр в числе и присваиваем ей значение 1, вводим n . Далее используем цикл while , проверяя деление числа n на 10 (так как тип числа int ). Это «отбрасывает» последнюю цифру в числе. Пока результат проверки истинный, инкриментируем x на 1.

    Пример работы программы можно увидеть на ideone.

    Mif 1

    Постановка задачи

    Даны действительные числа [latex]x, y[/latex]. Получить [latex]max(x,y)[/latex].

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

    Два действительных числа — [latex]x[/latex] и [latex]y[/latex].

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

    Число, являющееся максимумом из двух чисел — [latex]maxOfTwo[/latex]

    Тесты

    Входные данные Выходные данные
    1 3 4 4
    2 -3 -5 -3
    3 0 12 12

     

    Решение:

    Альтернативное решение:

     

    Описание решения:

    Объявляем три переменные типа  int  —  x, y, maxOfTwo . Вводим с клавиатуры значения для  x и  y . После чего с помощью условного оператора  if-else  проверяем  x>y . Если истинно, присваиваем переменной  maxOfTwo  значение переменной  x , а иначе  MaxOfTwo = y . Выводим значение  MaxOfTwo  с помощью функции  System.out.println() .

    Описание альтернативного решения:

    Объявляем три переменные типа  int  —  x, y, maxOfTwo . Вводим с клавиатуры значения для  x и  y . Используя тернарный оператор  ?: проверяем истинность выражения  x>y и присваиваем результат операции переменной  maxOfTwo . Выводим значение  MaxOfTwo  с помощью функции  System.out.println() .

     

     

     

     

    e-olymp 22. “Зеркально простые” числа

    Назовем число “зеркально простым”, если само число является простым, и простым является число, записанное теми же цифрами в обратном порядке.

    Найти количество “зеркально простых” чисел на промежутке от [latex]a[/latex] до [latex]b.[/latex]

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

    Два числа [latex]a[/latex] и [latex]b[/latex] [latex]( 1\le a, b \le 10000)[/latex].

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

    Вывести количество “зеркально простых” чисел на промежутке от [latex]a[/latex] до [latex]b[/latex] включительно.

    Задача взята с сайта e – olymp.

    Тесты

    Границы промежутка     Количество “зеркально простых” чисел
    1 10 4
    100 200 12
    1008 1230 19
    3340 3950 31
    9900 10000 4

    Алгоритм

    Перед нами была поставлена задача реализовать поиск всех “зеркально простых” чисел на заданном промежутке. Проверив в правильном ли порядке введены границы промежутка, организуем последовательный анализ для каждого числа из промежутка в теле главного цикла :

      1. Инициализируем две логические переменные, значение которых отвечает за прохождение теста на простоту самим числом и “зеркальным” соответственно.
      2. Методом последовательного перебора делителей определяем является ли данное число простым. Если данное утверждение истинно, переходим к последующим пунктам. В противном случае переходим на новый виток главного цикла.
      3. Выполняем последовательную сборку числа, записанного в обратном порядке.
      4. Проводим аналогичную проверку на простоту для “зеркального” числа.
      5. При условии, что это число также является простым, инкрементируем счетчик.

    Достигнув верхней границы промежутка, выводим количество “зеркально простых” чисел.

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

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

    Засчитанное решение

    e-olymp 29. Уровень палиндромности

    Задано натуральное [latex]M[/latex]. Если число не палиндром – записываем его в обратном порядка и слагаем с заданным. Действия повторяем до тех пор, пока не получим число-палиндром. Количество выполненных операций назовем уровнем палиндромности заданного числа.

    Найти уровень палиндромности заданного числа [latex]M[/latex].

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

    Единственное число [latex]M (0 < M < 10000)[/latex].

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

    Единственное число – уровень палиндромности.

    Задача взята с сайта e – olymp.

    Тесты

      Входные данные    Выходные данные
    1 0
    79 6
    101 0
    198 5
    865 2
    9998 6

    Алгоритм

    В данной задаче для заданного числа требуется определить уровень его палиндромности – количество раз, которое придется просуммировать его с обратным ему числом до получения палиндрома.

    1. Для начала инициализируем счетчик, который хранит в себе текущее значение уровня палиндромности, и логическую переменную, значение которой ложно до тех пор пока палиндром не найден. Данное условие и будет критерием для выполнения тела основного цикла.
    2. Присвоив значения переменным в цикле, выполняем последовательный разбор введенного числа на цифры и сборку “зеркального” числа.
    3. Проверяем равенство числа и ему обратного.
    4. Выполнение условного оператора сигнализирует о том, что палиндром найден, следовательно выводим “уровень”, изменяем значение логической переменной на противоположное и выходим из цикла.
    5. В противном случае суммируем текущее число и “зеркальное”, инкрементируем счетчик.
    6. Повторяем пункты 2, 3, 5 до истинности пункта 3 и перехода к 4.

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

    Код программы
    Засчитанное решение