Ответы на вопросы 5-й методической олимпиады учителей информатики. Раздел 1 (тест) 1) Буква П может быть расположена в одном из 5 мест 5-буквенного слова. В каждом из остальных 4 мест может быть или И или Р. Поэтому, число различных кодовых слов равно 5×24= 80; 2) Рассмотрим первое уравнение. х1, х2, х3, х4 могут иметь вид: 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111. Из них первому уравнению удовлетворяют только следующие комбинации. х1 х2 х3 х4 х1 х2 х3 х4 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 Так как второе уравнение имеет такой же вид, ему будут удовлетворять такие же комбинации. х3 х4 х5 х6 х3 х4 х5 х6 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 Рассмотрим выражение 0 0 0 1 оно получается прибавлением 0 1 к х3=0 и х4=0. Но так как в предыдущих столбцах таких выражений 2 (они отмечены жирным шрифтом) то выражение 0 0 0 1 будет снабжено повторителем 2. Также повторителем 2 будет снабжено выражение 0 0 1 0. В выражении 0 1 0 0 – х3=0, х4=1. С такими значениями в предыдущих столбцах, тоже две строки. Поэтому у 0 1 0 0 тоже будет повторитель 2. Повторитель 2 будет и у выражения 0 1 1 1. Повторяя рассуждения для строк 1 0 0 0 и 1 1 0 1 получим: Повторитель х3 х4 х5 х6 Повторитель х3 х4 х5 х6 2 0 0 0 1 2 1 0 0 0 2 0 0 1 0 2 1 0 1 1 2 0 1 0 0 2 1 1 0 1 2 0 1 1 1 2 1 1 1 0 Рассуждая аналогично для третьего и четвертого уравнений получим: Повторитель х5 х6 х7 х8 Повторитель х7 х8 х9 х10 4 0 0 0 1 8 0 0 0 1 4 0 0 1 0 8 0 0 1 0 4 0 1 0 0 8 0 1 0 0 4 0 1 1 1 8 0 1 1 1 4 1 0 0 0 8 1 0 0 0 4 1 0 1 1 8 1 0 1 1 4 1 1 0 1 8 1 1 0 1 4 1 1 1 0 8 1 1 1 0 Учитывая, что в последнем столбце 8 строк, получим ответ: 64 3) 205p=2p2+5 < 123. Учитывая, что P>5, видим, что неравенству удовлетворяет p= 6 и p=7. 4) Учитывая, что F имеет только один ноль, можем таблицу записать в конъюнктивной нормальной форме (произведение нулей, где каждый ноль есть сумма переменных х1-х8 или их отрицаний). В итоге, единственный ноль будет иметь вид: X1 X2 X3 X4 X5 X6 X7 X8 ; 5) Сразу видно, что С=1 не может быть (111 принимает двойной смысл). С=10 тоже не может быть (100 принимает двойной смысл). Рассмотрим С=01. Рассмотрим выражение 01 111 0 0. Это выражение можно прочитать по другому 0 111 100. Рассмотрим С=000. Понятно, что его можно прочитать как 0 0 0. Пусть С=001. Рассмотрим выражение 001 111 0 0. Это выражение можно прочитать как 0 0 111 100. Выражения 0 100 и 010 0 показывают, что С≠010. С≠011 из-за того что выражение 011100 имеет двойной смысл (011 100 и 0 111 0 0). С≠011 из-за того что двойной смысл имеет 011100 (011 100 и 0 111 0 0). Рассмотрим С=101. В этом случае к нему сзади нельзя пристроить ни нули ни единицы. Так как впереди окажется 10, к которому спереди нельзя присоединить ни нуля ни единицы. Если же мы 19 представим как 1 0, то с единицей на конце нет ни двузначного ни однозначного кода кроме 10 или 11. К этим же цифрам спереди ничего не приставишь. Ответ: 101; 6) Рассмотрим два ряда чисел 1 2 2 3 3 5 5 7 7 10 10 13 13 18 18 23 23 30 30 37 37 47 13 13 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Ряд внизу представляет собой траекторию. Ряд сверху – количество программ, используя которые, можно получить число соответствующее нижнему ряду. Например, чтобы получить число 3 нужна одна программа , к 2 прибавить 1. Число 4 можно получить двумя способами, либо к 3 прибавить два, либо 2 умножить на 2. Способов получить число 5 столько же сколько способов получить число 4, так как число 5 можно получить только прибавлением 1 к числу четыре. Тем самым мы вместо числа 4 переходим к числу 5 и все способы получения числа 4 переходит к числу 5. Из таблицы видно, что для получения числа 24 имеется 47 способов. Затем пропуск над числом 25, так как этого числа не должно быть в траектории. Над числом 26 тоже пропуск так как его можно получить только умножением числа 13 на 2, но при этом число 14 в траекторию не войдет. Ответ: 13. 7) Пусть P – выражение X&A=0, Q – выражение X&20=0, R – выражение X&5=0. Исходное высказывание примет вид ¬P→(Q→¬R). Или P ∪ (Q→¬R)= P ∪ (¬Q∪¬R)= (¬Q∪¬R) ∪ P= ¬(¬Q∪¬R)→P=(Q ∩ R)→P. Рассмотрим выражение Q. (xxxxxxxx)&(00010100)=0. Отсюда X=xxx0x0xx. Аналогично из R получим Х=ххххх0х0. Так как Q и R должны выполняться одновременно, получим Х=ххх0х0х0. Рассмотрим выражение P. (xxx0x0x0)&(aaaaaaaa)=0 Это выражение должно равняться нулю при любых х, поэтому А=(000а0а0а). Максимальное А будет равно 00010101=21. 8) Из того, что первые два байта IP – адреса узла и адреса сети совпадают следует, что первые два байта маски заполнены единицами, т.е. равны 255. Рассмотрим третий байт IP – адреса узла. Он равен 228. Третий байт сети равен 128. Превратим эти числа в восьмеричные 228 |8 128 |8 224 28 |8 128 16 |8 4 24 3 0 16 2 4 0 Мы получили 228=3448, 128=2008. Превратим восьмеричные числа в двоичные. Для этого каждую восьмеричную цифру превращаем в 3 двоичные. (См. [1]). 3448 =111001002, 2008=100000002. В итоге имеем ХХХХХХХХ & 11 100100 10 000000 Такой результат при побитовой конъюнкции может получиться (учитывая, что в маске вначале идут единицы, а затем нули) только если маска равна 100000002=128. 9) Эту задачу проще решить спользуя круги Эйлера. Шахматы | Теннис =7770. Отнимем отсюда чистый теннис получим 7770 – 5500=2270. Если сюда добавим пересечение, то получим объем запроса шахматы. 2270+1000=3270. Ответ: 3270 байтов. 10) Обозначим через P условие x∈ {1,3,5,7,9,12}, через Q условие x ∈ {3,6,9,12}, через R условие x ∈ A. Тогда исходное выражение примет вид (P → Q) ∪ R. Или P̅ ∪ Q ∪ R. Это выражение должно быть истинным при любом х. Рассмотрим выражение ̅ P. Это означает что х удовлетворяют все натуральные числа кроме 1,3,5,7,9,12. К нему добавляется множество Q, то есть числа 3,6,9,12. Тогда, х удовлетворяют все числа кроме 1,5,7. Следовательно, если А будет содержать эти числа, то исходному выражению будут удовлетворять все х принадлежащие натуральным числам. Минимальное А будет содержать только числа 1, 5, 7. Их сумма равна 13. Раздел 2 Найди ошибку или сделай на компьютере. 1) Имеем A+Aq+Aq2=30 или A(1+q+q2)=30. Это возможно в некоторой системе счисления. (A(1+q+q2))x=(30)x=3x. Это означает, 1+q+q2 должно делиться на три. Это возможно если q при делении на 3 дает остаток 1. Так как q<>1 и q не может быть четным то минимальное q равно 7. 2) Третий доехал до пункта В за час и целый час ждал второго. так что его общее время 8 часов. 3) Рассмотрим: not(((y<x*x) or (y>1) or (x>0)) and ((x<0) or (y<0) or (y>1) or (y<2-x))) Применяя к этому выражению правило Моргана, получим: ¬((y<x*x) or (y>1) or (x>0)) or ((x<0) or ¬(y<0) or (y>1) or (y<2-x)) Опять применяем правило Моргана (y>=x*x) and (y<=1) and (x<=0) or (x>=0) and (y>=0) and (y<=1) and (y>=2-x) Рассматривая график видим, что вместо y>=2-x должно быть y<=2-x. Ошибкой является выражение (y<2-x). 4) Программа на языке Visual Basic. Sub table() Dim i, j, n, m As Integer Dim a, h, s As Double Worksheets("Лист1").Activate Randomize: h = 0.1: a = 2.1 For i = 2 To 21 For j = 2 To 21 Cells(i, j) = Int(1000 * Rnd()) + 1 Next j Next i Worksheets("Лист2").Activate For i = 2 To 21 For j = 2 To 21 Cells(i, j) = a * Worksheets("Лист1").Cells(i, j) a=a+h Next j Next i Worksheets("Лист3").Activate For i = 2 To 21 For j = 2 To 21 Cells(i, j) = Worksheets("Лист1").Cells(i, j) + Worksheets("Лист2").Cells(i, j) a=a+h Next j Next i End Sub 5) Программа на языке Visual Basic. Sub Kniga() Dim mparagraph As Paragraph For Each mparagraph In ActiveDocument.Paragraphs With mparagraph If .Range.Words.Count >= 3 Then .Range.Words(1).Italic = True End If End With Next mparagraph End Sub Раздел 3. Подумай! 1) Пусть в мешок поместили х шуб, тогда число курток равно 20-4х. Условия таможни будут х+20 -4х ≤11. Или х≥3. Обозначим суммарную стоимость вещей положенных в мешок через S. Тогда: S=60000х+20000(20-4х)=20000(3х+20-4х)=20000(20-х). Следовательно, S будет максимальным при х=3. Максимальная S=340000. 2) Применим метод резолюций. Обозначим: Н – Никифор вежлив со мной, Д – Несчастливый день. С – среда, П – пасмурный день, З – берут ̅ , С→П, с собой зонт. Дж – идет дождь. Высказывания имеют вид: Н→Д ̅ →С, Дж→З, Д ̅ →П ̅ . По правилу импликации имеем З→П, Н ̅∪Д ̅ Н С̅ ∪ П З̅ ∪ П Н∪С ̅̅̅̅ ∪ З Дж ̅ Д∪ П ̅̅̅̅. Чтобы Сокращая по правилу резолюций, получим в остатке П и Дж получить ноль их надо одновременно отрицать. То есть мы должны к ̅ . Это предположение приводит к высказываниям добавить Дж и П противоречию. Следовательно, верным будет отрицание нашей ̅. добавки. Таким образом мы должны отрицать выражение Дж ∩ П ̅̅̅̅ ∪ П. Применяя правило Применив правило Моргана получим Дж импликации получим Дж→П. Дождливые дни пасмурны. 3) Баку-Уфа. 4) Задача сводится к игре двух игроков Наф-Наф и объединенная команда Ниф-Нифа и Нуф-Нуфа. Выигрывает Наф-Наф. После пнрвого хода Ниф-Нифа в корзине окажется от 28 до 32 желудей. Наф-Наф должен взять столько, чтобы в корзине осталось 27 желудей. Ниф-Ниф и Нуф-Нуф вместе возьмут не больше 8 желудей. Наф-Наф, в этом случае, может оставить в корзине 18 желудей. Опять ходят Ниф-Ниф и Нуф-Нуф. Теперь Наф-Наф оставляет в корзине 9 желудей и после очередного хода Ниф-Нифа и Нуф-Нуфа забирает последние желуди. 5) 111111 и 333333 делятся на 7. Следовательно, на 7 делятся и 2016 единиц и 2016 троек. Исходное число можно разбить на число состоящее из 2016 троек, число первой цифрой которого является А за которой располагаются 2016 нулей и число с 2016 единицами за которы стоит 2017 нулей. Так как первое и третье число на 7 делятся. рассмотрим второе число. Понятно что при А равном нулю или 7 исходное число на 7 делится. Рассмотрим А=1. Т.е. число 1 с 2016 нулями. 10 при делении на 7 дает остаток 3. Спустим сверху ноль. Число 30 при делении на 7 дает остаток 2. Рассмотрим число 20. При делении на 7 оно дает остаток 6. Число 60 при делении на 7 дает остаток 4. Число 40 при делении на 7 даст остаток 5. Опять, спуская сверху ноль, получим число 50. При делении на 7 мы опять получим 1. Получили цикл. Это доказывает, что если А равно натуральному числу меньшему чем 7, то число А с 2016 нулями на 7 не делится. Пусть А равно 8 или 9. Тогда это число в свою очередь можно разбить на сумму в которой первое число это 7 с 2016 нулями, второе число 1 или 2 с 2016 нулями. Первое число на 7 делится, второе, как мы доказали, нет. В итоге получаем, что исходное число делится на 7 если А равно 0 или 7. 6) Пусть стопка состоит из 3 брикетов. Рассмотрим трехзначные двоичные числа 000, 001, 010, 011, 100, 101, 110, 111. Пусть 0 означает соленую рыбу 1 – копченую. Понятно, что из приведенного набора не должно быть стопки 010. Поэтому для стопки из 3 брикетов – ответ 7. Рассмотрим два последних брикета из этой стопки. Пусть А список. А={00, 01, 11, 00, 01, 10, 11}. Стопка из 4 брикетов получится добавлением 0 или 1 к числам этого списка. В итоге опять должны появится числа 000, 001, 011, 100, 101, 110, 111. Запишем их в виде: 234 2 000 2 001 2 011 1 100 1 101 2 110 2 111 Здесь в первой строке стоят номера брикетов. Брикет 000 появится если мы добавим 0 в 1-й и 4-й элемент списка А. Поэтому перед 000 стоит повторитель 2. Брикет 001 появится если мы добавим 1 в 1-й и 4-й элемент списка А. Поэтому перед 001 тоже стоит повторитель 2. Элемент 011 получается если мы добавим 1 к 2-му и 5-му элементу списка А. Поэтому перед 011 стоит повторитель 2. Рассмотрим элемент 100. Он получится если мы прибавим 0 к 6-му элементу списка А. Он в списке один, поэтому перед 100 стоит повторитель 1. Аналогично получаем остальные повторители. Таким образом стопку из 4 брикетов можно получить 12 способами. Совершенно аналогично для стопок из 5, 6, 7 и 8 брикетов, получим. 345 456 567 678 3 000 5 000 9 000 16 000 3 001 5 001 9 001 16 001 3 011 5 011 9 011 16 011 2 100 4 100 7 100 12 100 2 101 4 101 7 101 12 101 4 110 7 110 12 110 21 110 4 111 7 111 12 111 21 111 Итак, стопку из 8 брикетов можно уложить 114-ю способами. Конкурс одной задачи Пусть мы имеем k камней. Из них m камней в большей куче и n камней в меньшей куче. Составляем зону абсолютного выигрыша. Это если число камней в обеих кучах >39. Затем находим наибольшее n, число камней в меньшей куче ( n=k div 2 ). Тогда m=k-n. Теперь, последовательно находим m:=m*2, n:=n*2, m:= m+1, n:=n+1 и каждый раз находим k1=n+m. Если k1 хотя бы раз окажется в зоне абсолютного выигрыша или если при всех k1 число камней в большей куче (m) хотя бы раз не окажется в списке с номером k1, то число камней в большей куче присоединяем к с списку выигрышей с номером k. Уменьшаем m на 1 и опять находим m:=m*2, n:=n*2, m:= m+1, n:=n+1, находим k1 и т.д. Опять уменьшаем m на 1 и повторяем процесс до тех пор, пока m не станет меньше n. Тем самым мы вычислили все m для которых при k=m+n первый игрок выигрывает. Уменьшаем k на 1 и повторяем все рассуждения. Ответ: Число камней в обеих кучах Число камней в большой куче у 1-го игрока, дающего ему выигрыш. 30 15-30 29 15-29 28 14-28 27 14-27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 14-26 13, 15-25 13, 14, 16-24 12, 14, 15, 17-23 12, 13, 15, 16, 18-22 11, 13, 14, 16,17, 19-21 11,12, 14,15, 17, 18, 20 10, 12,13, 15,16, 18, 19 10 -17 9, 17 9 -16 8 - 11, 13 11-14 7-10 12 7-12 11 6, 8 10 6-10 9 5-9 8 7 7 4-7 6 4-5 5 3, 5 4 3-4 3 2-3 2 1 Для решения этой задачи можно написать программу. type digit = set of 1..100; var i,j,k,a,b,n,m: integer; mnog: array[1..100] of digit; begin assign(output,'input.txt'); rewrite(output); k:=26; for i:=27 to 39 do mnog[i]:=[1..39]; while k>0 do begin n:=k div 2; m:=k-n; i:=k; while i>=m do begin j:=0; n:=k-i; if 2*i+n>39 then mnog[k]:=mnog[k]+[i] else begin a:=2*i+n; if 2*i in mnog[a] then j:=j+1; a:=2*n+i; if 2*n>i then b:=2*n else b:=i; if n=0 then j:=j+1 else if b in mnog[a] then j:=j+1; if i+1 in mnog[k+1] then j:=j+1; if n+1>i then b:=n+1 else b:=i; if b in mnog[k+1] then j:=j+1; if j<4 then include(mnog[k],i); end; i:=i-1 end; k:=k-1; end; for j:=30 downto 1 do begin for i:=1 to 30 do if i in mnog[j] then write(i,' '); writeln end; end. 1