Информатика ЕГЭ 27 задание разбор

27-е задание: «Анализ числовых последовательностей»
Уровень сложности — высокий,
Требуется использование специализированного программного обеспечения — да,
Максимальный балл — 2,
Примерное время выполнения — 35 минут.
  
Проверяемые элементы содержания: Умение создавать собственные программы (20–40 строк) для анализа числовых последовательностей

Плейлист видеоразборов задания на YouTube:


Задание демонстрационного варианта 2022 года ФИПИ

На вход программы поступает последовательность чисел, произвести анализ пар

27_4:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
Компьютер наземной станции слежения получает от объектов-самолётов, находящихся в зоне её работы, идентификационные сигналы, представляющие собой последовательность из N целых положительных чисел. Каждый объект направляет на наземную станцию уникальное число, т. е. все числа в получаемой станцией последовательности различны. Обработка сигнала представляет собой рассмотрение всех пар различных элементов последовательности, при этом элементы пары не обязаны быть переданы непосредственно друг за другом, порядок элементов в паре не важен. Считается, что возникла одна критическая ситуация, если произведение элементов некоторой пары кратно 58.

Необходимо определить общее количество возникших критических ситуаций.

Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1 < N < 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: общее количество возникших критических ситуаций.

Пример входных данных:

4
2
6
29
87

Пример выходных данных для приведённого выше примера входных данных:

4
Из четырёх заданных чисел можно составить б попарных произведений:

2*6 = 12 
2*29 = 58 
2*87 = 174 
6*29 = 174 
6*87 = 522 
29*87 = 2523

Из них на 58 делятся 4 произведения (выделены синим).

Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.

Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

✎ Программа эффективна по времени и по памяти (4 балла):

  • Язык Паскаль (версия PascalABC):
  • var
      N: integer; {количество чисел} 
      a: integer; {очередное число} 
      n58, n29, n2: integer;
      k58: integer; {количество требуемых пар} 
      i: integer;
     
    begin
      readln(N);
      n58 := 0; 
      n29 := 0; 
      n2 := 0; 
      for i := 1 to N do 
      begin
        readln(a);
        if a mod 58 = 0 then 
          n58 := n58 + 1 
        else if a mod 29 = 0 then 
          n29 := n29 + 1 
        else if a mod 2 = 0 then 
          n2 := n2 + 1;
      end;
      k58 := n58 * (n58 - 1) div 2 + n58 * (N - n58) + n2 * n29; 
      writeln(k58)
    end.
  • Язык Python (версия Python 3):
  • n=int(input())
    n58,n29,n2=0,0,0
    for i in range(n):
        a=int(input())
        if a % 28 == 0:
            n58+=1
        elif a % 29 == 0:
            n29+=1
        elif a % 2 == 0:
            n2+=1
    k58=n58 * (n58-1) // 2 + n58 * (n-n58) + n2 * n29
    print(k58)
  • Произведение двух чисел делится на 58, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
  • A. Оба сомножителя делятся на 58.
  • Б. Один из сомножителей делится на 58, а другой не делится.
  • B. Ни один из сомножителей не делится на 58, но один сомножитель делится на 2, а другой — на 29.
  • Почему именно 2 и 29?
  • Берем два делителя числа 58, произведение которых дает число 58: 2*29 = 58. При этом одно из них — наименьший делитель (в нашем случае 2), а другой, не должен делиться на первый найденный делитель (29/2 <> 0).
  • Условие делимости произведения на 58 можно сформулировать проще, например так:
  • (один из сомножителей делится на 58) 
                        ИЛИ 
    (один сомножитель делится на 2, а другой — на 29)
    
  • Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
  • При вводе чисел можно определять, делится ли каждое из них на 58, 2 и 29, и подсчитывать следующие значения:
    1. n58 — количество чисел, кратных 58;
    2. n29 —количество чисел, кратных 29, но не кратных 2 и 58;
    3. n2 — количество чисел, кратных 2, но не кратных 29 и 58.
  • Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков.
  • Количество пар, удовлетворяющих условию А, можно вычислить по формуле n58*(n58 - 1)/2.
  • Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n58*(N - n58).
  • Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2 * n29.
  • Поэтому искомое количество пар вычисляется по формуле:
  • n58 * (n58 - 1)/2 + n58 * (N - n58) + n2 * n29

✎ Программа неэффективная (2 балла):

  • Язык Паскаль (версия PascalABC):
  • var
      i, j, k, n: integer;
      a: array[1..1000]of integer;//очередное значение
     
    begin
      readln(n);
      for i := 1 to n do 
      begin
        readln(a[i]); 
      end;
      k := 0;
      for i := 1 to n - 1 do 
        for j := i + 1 to n do
          if a[i] * a[j] mod 58 = 0 then 
            k := k + 1;
      writeln(k);
    end.
    Полный перебор: все числа сохраняются в массиве, рассматриваются все возможные пары и подсчитывается количество подходящих произведений.

27_6: Разбор 27 задания демоверсии 2018 года (ФИПИ):

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

 
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26.

Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.
  
Пример входных данных:

4
2
6
13
39

Пример выходных данных для приведённого выше примера входных данных:

4
Из четырёх заданных чисел можно составить 6 попарных произведений:

2·6 = 12 
2·13 = 26 
2·39 = 78 
6·13 = 78
6·39 = 234 
13·39 = 507

Из них на 26 делятся 4 произведения:

2·13=26; 
2·39=78; 
6·13=78; 
6·39=234

Требуется написать эффективную по времени и по памяти программу для
решения описанной задачи.

Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
    Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
    А. Оба сомножителя делятся на 26.
    Б. Один из сомножителей делится на 26, а другой не делится.
    В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой – на 13.

    Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например, так:
    (один из сомножителей делится на 26) ИЛИ
    (один сомножитель делится на 2, а другой – на 13).
    Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.

    При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения:
    1) n26 – количество чисел, кратных 26;
    2) n13 – количество чисел, кратных 13, но не кратных 26;
    3) n2 – количество чисел, кратных 2, но не кратных 26.

    Примечание для проверяющего. Сами числа при этом можно не хранить.
    Каждое число учитывается не более чем в одном из счётчиков.
    Количество пар, удовлетворяющих условию А, можно вычислить по формуле n26·(n26 – 1)/2.
    Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n26·(N – n26).
    Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2·n13.
    Поэтому искомое количество пар вычисляется по формуле

    n26·(n26 – 1)/2 + n26·(N – n26) + n2·n13

    ✎ Программа эффективна и по времени, и по памяти (4 балла):
    Программа на языке Паскаль (версия PascalABC):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    var
      N: integer; {количество чисел}
      a: integer; {очередное число}
      n26, n13, n2: integer;
      k26: integer; {количество требуемых пар}
      i: integer;
    begin
      readln(N);
      n26 := 0;n13 := 0;n2 := 0;
      for i := 1 to N do 
      begin
        readln(a);
        if a mod 26 = 0 then
          n26 := n26 + 1
        else if a mod 13 = 0 then
          n13 := n13 + 1
        else if a mod 2 = 0 then
          n2 := n2 + 1;
      end;
      k26 := n26 * (n26 - 1) div 2 + n26 * (N - n26) + n2 * n13;
      writeln(k26)
    end.

    Программа на языке Python (версия Python 3):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    n=int(input())
    n26,n13,n2=0,0,0
    for i in range(n):
        a=int(input())
        if a % 26 == 0:
            n56+=1
        elif a % 13 == 0:
            n13+=1
        elif a % 2 == 0:
            n2+=1
    k26=n26 * (n26-1) // 2 + n26 * (n-n26) + n2 * n13
    print(k26)

    Программа на языке Бейсик:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    N26 = 0
    N2 = 0
    N13 = 0
    NX = 0
    INPUT N
    FOR I = 1 TO N
       INPUT A
     IF A MOD 26 = 0 THEN
       N26 = N26 + 1
     ELSE
       IF A MOD 13 = 0 THEN
         N13 = N13 + 1
        ELSE
          IF A MOD 2 = 0 THEN
            N2 = N2 + 1
          ELSE NX = NX + 1
          END IF
        END IF
     END IF
    NEXT I
    K26 = N26*(N26 - 1)\2 + N26*(N2 + N13 + NX) + N2*N13
    PRINT K26

27_7: задание досрочного экзамена 2020 г, ФИПИ (2 вариант):

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, разность которых чётна, и в этих парах, по крайней мере, одно из чисел пары делится на 19. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.
  
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (2 ≤ N ≤ 10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример входных данных:

5
38
12
57
16
57

Пример выходных данных для приведённого выше примера входных данных:

57 57
Пояснение. Из данных пяти чисел можно составить три различные пары, удовлетворяющие условию: (38, 12), (38, 16), (57, 57). Наибольшая сумма получается в паре (57, 57). Эта пара допустима, так как число 57 встречается в исходной последовательности дважды.

Напишите эффективную по времени и памяти программу для решения этой задачи.

Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз.
Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N.

Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла.

Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.

Типовые задания для тренировки

Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
  • ✎ Программа эффективна по времени и памяти
  • Язык Pascal (PascalABC):
    Вариант 1:

    const
      p = 19;
     
    var
      N: integer; {количество чисел}
      a: integer; {очередное число}
      m0, m1: integer; {чётный и нечётный максимумы}
      mp0, mp1: integer;  {чётный и нечётный максимумы, кратные p}
      x, y: integer; {ответ – пара чисел}
      i: integer;
     
    begin
      m0 := 0; m1 := 0;
      mp0 := 0; mp1 := 0;
      x := 0; y := 0;
      readln(N);
      for i := 1 to N do
      begin
        readln(a);   
         // для четных
        if a mod 2 = 0 then  
        begin
          // если кратное
          if (a mod p = 0) and (a >= mp0) then 
            begin
              if mp0 > m0 then
                m0:= mp0;
              mp0:=a
            end     
            else if a > m0 then 
              m0 := a;
         end
         else 
            begin
        // для нечетных
            if (a mod p = 0)and(a>=mp1) then 
              begin 
                if mp1>m1 then 
                  m1:=mp1;
                mp1 := a;
              end
              else if a>m1 then
                m1:=a;
             end;  
      end;
     //  writeln('mp0=', mp0, 'm0=', m0);
      if (mp0 > 0) and (m0 > 0) then
      begin
        x := mp0; y := m0; 
      end; 
     // writeln('mp1=', mp1, 'm1=', m1);
      if (mp1 > 0) and (m1 > 0) and (mp1 + m1 > x + y) then
      begin
        x := mp1; 
        y := m1;
      end;
      writeln('=', x, ' ', y)
    end.

    Язык Pascal (PascalABC):
    Вариант 2:

    const
      p = 19;
     
    var
      n, i, x, k19n, k19chet, n19chet, n19n, m1, m2: integer;
     
    begin
      readln(n); {количество чисел}
      readln(x); {первое число}
      // обнуление всех переменных
     
      k19chet := 0; // четный кратный
      n19chet := 0; // четный некратный
      k19n := 0; // нечетный кратный
      n19n := 0; // нечетный некратный
      m1 := 0; m2 := 0; // максимальные
      // цикл до n - 1, т.к. первое число уже считали
      for i := 1 to n - 1 do
      begin
        // проверка, если четный и кратный
        if (x mod p = 0) and (x mod 2 = 0) and (x > k19chet) then
        begin
          k19chet := x;
        end;
        // проверка, если четный и некратный
        if (x mod p <> 0) and (x mod 2 = 0) and (x > n19chet) then
        begin
          n19chet := x;
        end;
        // проверка, если нечетный и кратный
        if (x mod p = 0) and (x mod 2 = 1) and (x > k19n) then
        begin
          k19n := x;
        end;
        // проверка, если нечетный и некратный  
        if (x mod p <> 0) and (x mod 2 = 1) and (x > n19n) then 
        begin
          n19n := x;
        end;
     
        readln(x); // считываем очередное число
        // если x кратно и есть такое некратное n19chet, сумма с которым была бы больше чем m1 + m2
        if (x mod p = 0) and ((x + n19chet) mod 2 = 0) and (x + n19chet > m1 + m2) and (n19chet > 0) then
        begin
          m1 := x; m2 := n19chet;
        end;
        // если x кратно и есть такое некратное n19n, сумма с которым была бы больше чем m1 + m2
        if (x mod p = 0) and ((x + n19n) mod 2 = 0) and (x + n19n > m1 + m2) and (n19n > 0) then
        begin
          m1 := x; m2 := n19n;
        end;
        // если есть такое кратное k19n, сумма с которым была бы четной и больше чем m1 + m2
        if ((x + k19n) mod 2 = 0) and (x + k19n > m1 + m2) and (k19n > 0) then
        begin
          m1 := x; m2 := k19n;
        end;
        // если есть такое кратное k19chet, сумма с которым была бы четной и больше чем m1 + m2
        if ((x + k19chet) mod 2 = 0) and (x + k19chet > m1 + m2) and (k19chet > 0) then
        begin
          m1 := x; m2 := k19chet;
        end;
      end;
      writeln(m1, ' ', m2)
    end.
    Язык Python (Python 3):

    p = 19
    m0 = m1 = mp0 = mp1 = 0
    N = int(input())
    for i in range(N):
    	 a = int(input())
    	 if a % 2 == 0:
    		 if a % p == 0 and a >= mp0:
    			 if mp0 > m0: m0 = mp0
    			 mp0 = a
    		 elif a > m0: m0 = a
    	 else:
    		 if a % p == 0 and a >= mp1:
    			 if mp1 > m1: m1 = mp1
    			 mp1 = a
    		 elif a > m1: m1 = a
    x = y = 0
    if mp0 > 0 and m0 > 0:
    	x = mp0; y = m0
    if mp1 > 0 and m1 > 0 and mp1 + m1 > x + y:
    	x = mp1; y = m1
    print(x,y)

    Ещё один путь решения – записать всю последовательность в массив и анализировать её в несколько проходов. Ниже приводится реализующая такой алгоритм программа на языке C++. В этой программе массив с исходными данными обрабатывается два раза: на первом проходе находятся индексы максимального чётного и нечётного элементов, кратных p, на втором проходе – общие чётный и нечётный максимумы. При этом элементы, выделенные как кратные при первом проходе, во время второго прохода из сравнения исключаются. Такая программа эффективна по времени (несмотря на повторную обработку массива, общее время работы пропорционально N), но неэффективна по памяти. Максимальная оценка за такую программу при отсутствии в ней синтаксических и содержательных ошибок – 3 балла.

  • ✎ Правильная программа на языке C++, эффективная только по времени
  • С++:

    #include <iostream>
    using namespace std;
    int main() {
     const int p = 19; // делитель
     int N; cin >> N; // количество элементов
     int a[N]; // элементы последовательности
     for (int i = 0; i < N; ++i) cin >> a[i];
     int imp0 = -1, imp1 = -1; //индексы максимумов, кратных p
     for (int i = 0; i < N; ++i) {
    	if (a[i] % p == 0) {
    		 if (a[i] % 2 == 0) {
    			if (imp0 == -1 || a[i] > a[imp0]) imp0 = i;
    		}
    		else {
    			if (imp1 == -1 || a[i] > a[imp1]) imp1 = i;
    		}
    	}
     }
     int im0 = -1, im1 = -1; // индексы общих максимумов
     for (int i = 0; i < N; ++i) {
    	 if (i != imp0 && i != imp1) {
    		 if (a[i] % 2 == 0) {
    			if (im0 == -1 || a[i] > a[im0]) im0 = i;
    		 }
    		 else {
    			if (im1 == -1 || a[i] > a[im1]) im1 = i;
    		 }
    	 }
     }
     int x = 0, y = 0; // пара чисел для ответа
     if (imp0 != -1 && im0 != -1) {
    	x = a[imp0]; y = a[im0];
     }
     if (imp1 != -1 && im1 != -1 && a[imp1] + a[im1] > x + y) {
    	x = a[imp1]; y = a[im1];
     }
     cout << x << ' ' << y << endl;
     return 0;
    }
  • ✎ Правильная, но неэффективная программа на языке Паскаль
  • Запишем все исходные числа в массив, переберём все возможные пары и выберем подходящую. Такое решение не является эффективным ни по памяти (требуемая память зависит от размера исходных данных), ни по времени (количество возможных пар, а значит, количество действий и время счёта с ростом количества исходных элементов растут квадратично). Подобная программа оценивается не выше 2 баллов.

    Язык Pascal (версия PascalABC):

    const
      p = 19;
    var
      N: integer; {количество чисел}
      a: array [1..10000] of integer; {исходные данные}
      x, y: integer; {ответ – пара чисел}
      i, j: integer;
    begin
      readln(N);
      for i := 1 to N do readln(a[i]);
      x := 0; y := 0;
      for i := 1 to N - 1 do
      begin
        for j := i + 1 to N do
        begin
          if ((a[i] - a[j]) mod 2 = 0) and
                ((a[i] mod p = 0) or (a[j] mod p = 0)) and
          (a[i] + a[j] > x + y)
          then
          begin
            x := a[i]; y := a[j]
          end
        end
      end;
      writeln(x, ' ', y)
    end.

Выбрать из каждой пары одно число

27_1:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

 
Задание А (более легкое, чем Б)
Имеется набор данных, состоящий из 5 пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.

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

Максимальная оценка за правильную программу — 2 балла.

  
Задание Б (более сложное, чем А)
Имеется набор данных, состоящих из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.

Напишите программу для решения этой задачи.
Постарайтесь сделать программу эффективной по времени, если время работы программы пропорционально количеству пар чисел N, т.е. при увеличении N в k раз время работы программы должно увеличиваться на более чем в k раз.

Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.

Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.

Как в варианте А, так и в варианте Б программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).

Например:
2  6
4  1
7  3
2  9
7  4
sum=231
Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

✎ Задание Б (алгоритм), более сложное, 4 балла:

  • поскольку в задании указано, что «имеется набор данных, состоящих из пар…», то введем в программу переменную n для количества пар, значение которой будет считываться со стандартного входного потока:
  • n:longint; {количество пар чисел};
  • объявим сами числа типа integer, переменную цикла — i — типа integer и дополнительные переменные, смысл которых будет объяснен ниже. Объявление сделаем в отдельных строках (так делать не обязательно), чтобы можно было ввести удобно комментарии:
  •  x,y: integer; {пара чисел}
     max: integer; {максимальное из пары}
     min: integer; {минимальное из пары}
     sum:longint; {сумма квадратов отобранных чисел}
     min_kvadr:longint; {мин. нечетная разница квадратов max и min}
     i:integer;
  • так как в задании не оговаривается, что пары чисел считывается из файла, значит их необходимо считать со стандартного входного потока оператором readln(); т.е. организуем цикл:
  • for i:=1 to n do begin
      readln(x,y);
      ...

    Допустим имеем пары:

    2 6
    4 1
    7 3
    2 9
    7 4
    
  • Чтобы получить в итоге максимальную сумму, то необходимо суммировать те числа из пар чисел, которые максимальны в паре, т.е. в нашем случае будем суммировать квадраты выделенных чисел из пар:
  • 2 6
    4 1
    7 3
    2 9
    7 4
    
  • но сначала определим максимальное и минимальное число из каждой пары:
  • if x>y then 
    begin 
       max:=x; min:=y 
    end
    else 
    begin 
        max:=y;min:=x 
    end;
  • далее суммируем квадраты максимальных чисел:
  • sum:=sum+sqr(max);
  • поскольку, согласно заданию, сумма должна быть нечетной, то в случае, если сумма будет четной, нам необходимо выбрать пару, в которой разница между квадратами чисел минимальна и при этом нечетна и взять из этой пары не максимальный, а минимальный элемент. Или лучше просто вычислить разницу между квадратами максимума и минимума и затем вычесть ее из получившейся четной суммы. Выделим пару, разница между квадратами чисел которой минимальна и при этом нечетна:
  • 2 6 - разница 32 (36 - 4)
    4 1 - разница 15 (16 - 1)
    7 3 - разница 40 (49 - 9)
    2 9 - разница 77 (81 - 4)
    7 4 - разница 33 (49 - 16)
    
  • поиск минимальной и нечетной разницы между квадратами чисел в паре:
  • if((max-min) mod 2 > 0) and ((sqr(max)-sqr(min)) < min_kvadr) then
        min_kvadr:=sqr(max) - sqr(min)
  • для переменной, обозначающей разницу, до цикла необходимо назначить максимально возможное значение:
  • min_kvadr:=1073676289;  {32 767 * 32 767 (самое большое в типе integer) }
  • таким образом, в цикле у нас происходит:
  • 1. поиск максимального и минимального числа из пары;
  • 2. вычисляется сумма максимальных чисел из каждой пары;
  • 3. находится минимальная разница квадратов максимального и минимального числа в парах.
  • после цикла необходимо проверить сумму на нечетность. Если сумма четная (чего НЕ должно быть по условию), то отнимем от суммы вычисленную минимальную разницу. Но при этом учтем, что если не нашлось нечетной минимальной разницы, то выводим 0 (по условию):
  • if sum mod 2 = 0 then begin
      if min_kvadr = 1073676289 then sum := 0
      else sum:=sum - min_kvadr
    end;

Эффективная программа на языке Паскаль (версия Pascal ABC):

1
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
var
 n:longint; {количество пар чисел}
 x,y: integer; {пара чисел}
 max: integer; {максимальное из пары}
 min: integer; {минимальное из пары}
 sum:longint; {сумма квадратов отобранных чисел}
 min_kvadr:longint; {мин. нечетная разница квадратов max и min}
 i:integer;
begin
sum:=0;
readln(n);
min_kvadr:=1073676289;  {32 767 * 32 767, самое большое integer}
for i:=1 to n do begin
  readln(x,y);
  if x>y then begin max:=x; min:=y end
  else begin max:=y;min:=x end;
  sum:=sum+sqr(max);
  if((max-min) mod 2 > 0) and (sqr(max)-sqr(min) < min_kvadr) then
    min_kvadr:=sqr(max) - sqr(min)
end;
if sum mod 2 = 0 then begin
  if min_kvadr = 1073676289 then sum := 0
  else sum:=sum - min_kvadr
end;
writeln('sum=',sum)
end.

Пример работы программы:

3
1 4
2 4
3 4
sum=41

✎ Задание А (более легкое, 2 балла максимум):

  • так как в задании указано, что пар чисел ровно 5, то введем в программу константу n=5
  • Решение на языке Паскаль (версия PascalABC):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    const n = 5; {количество пар чисел}
    var
    x,y: longint; {пара чисел}
    max_sum: longint; {максимальная из сумм}
    sum:array [1..15]of longint; {суммы квадратов всех комбинаций чисел}
    i,k:longint;
    begin
    readln(x,y);
    sum[1]:=sqr(x);
    sum[2]:=sqr(y);
    k:=3; {счетчик для сумм}
    for i:=2 to n do begin
      readln(x,y);
      sum[k]:=sum[k-2]+sqr(x);   {1 шаг: s3=s1+x*x}{2 шаг: s7=s4+x*x}
      sum[k+1]:=sum[k-2]+sqr(y); {1 шаг: s4=s1+y*y}{2 шаг: s8=s4+y*y}
      sum[k+2]:=sum[k-1]+sqr(x); {1 шаг: s5=s2+x*x}{2 шаг: s9=s6+x*x}
      sum[k+3]:=sum[k-1]+sqr(y); {1 шаг: s6=s2+y*y}{2 шаг: s10=s6+y*y}
      k:=k+4;
    end;
    max_sum:=sum[1];
    for i:=1 to n*n do
      if (sum[i]>max_sum) and (sum[i] mod 2 <>0) then max_sum:=sum[i];
    if (max_sum=sum[1]) and (max_sum mod 2 = 0) then max_sum:=0;
    writeln(max_sum)
    end.

📹 Видео
📹 Видеорешение на RuTube здесь


Набор данных, состоящих из троек чисел

27_2:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  

Вам предлагается два задания с похожими условиями: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору. Задание Б более сложное, его решение оценивается выше. Итоговая оценка выставляется как максимальная из оценок за задания А и Б.

  
А. Имеется набор данных, состоящий из 5 троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была минимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.

Напишите программу для решения этой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеют значения.
Максимальная оценка за правильную программу — 2 балла.

Б. Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была минимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.

Постарайтесь сделать программу эффективной по времени и по используемой памяти.

Программа считается эффективной по времени, если время работы программы пропорционально количеству чисел N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.

Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.

Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.

Как в варианте А, так и в варианте Б программа должна напечатать одно число — минимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).

Напоминаем! не забудьте указать, к какому заданию относится каждая из представленных Вами программ.

Перед текстом программы кратко опишите Ваш алгоритм решения, укажите использованный язык программирования и его версию.

Входные данные
Для варианта А на вход программе подается 5 строк, каждая из которых содержит три натуральных числа, не превышающих 10000.
 
Пример входных данных для варианта А:

1 3 2
2 1 2
2 5 1
1 3 4
6 1 1

Для варианта Б на вход программе в первой строке подается количество троек чисел N (1<=N<=100000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10000.   Пример входных данных для варианта Б:

5
1 3 2
2 1 2
2 5 1
1 3 4
6 1 1

Пример выходных данных для приведенных выше примеров входных данных:
6

Типовые задания для тренировки

Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

✎ Задание Б (4 балла)

Чтобы получить минимально возможную сумму, будем брать из каждой тройки наименьшее число. Если полученная при этом сумма будет кратна 5, ее придется увеличить. Для этого достаточно в одной из троек, где хотя бы два числа имеют разные остатки при делении на 5, заменить ранее выбранное число на число с другим остатком от деления на 5 из той же тройки. При этом модуль разности между прежним и новым, выбранным из тройки, должен быть минимально возможным.

Пример правильной и эффективной программы для задания Б на языке Паскаль (версия PascalABC):

1
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
30
31
32
const
  aMax = 10000;{наибольшее возможное исходное число}
 
var
  N: longint; {количество троек}
  a, b, c, tmp: longint;{тройка чисел}
  s: longint;{сумма выбранных чисел}
  D_min: longint;{мин. разница в тройке не кратная 5}
  i: longint;{}
 
begin
  s := 0;
  D_min := aMax + 1;
  readln(N);
  for i := 1 to N do 
  begin
    readln(a, b, c);
    if (a > b) then begin tmp := a;a := b;b := tmp end;
    if(b > c) then begin
      tmp := b;b := c;c := tmp;
      if (a > b) then begin tmp := a;a := b;b := tmp end
    end; {a,b,c отсортированы по возрастанию}
    s := s + a;
    if((b - a) mod 5 > 0 ) and ((b - a) < D_min) then D_min := b - a;
    if((c - a) mod 5 > 0 ) and ((c - a) < D_min) then D_min := c - a
  end;
  if s mod 5 = 0 then begin
    if D_min > aMax then s := 0
    else s := s + D_min
  end;
  writeln(s)
end.

✎ Задание А (2 балла)

В цикле перебираются все возможные суммы, и среди них ищется удовлетворяющая условию.

На языке Паскаль (версия PascalABC):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var
  a: array[1..5, 1..3] of longint; 
  i1, i2, i3, i4, i5: longint; 
  s, sMin: longint;
 
begin
  for i1 := 1 to 5 do 
    readln(a[i1, 1], a[i1, 2], a[i1, 3]); 
  sMin := 100000; 
  for i1 := 1 to 3 do 
    for i2 := 1 to 3 do 
      for i3 := 1 to 3 do
        for i4 := 1 to 3 do
          for i5 := 1 to 3 do 
          begin
            s := a[1, i1] + a[2, i2] + a[3, i3] + a[4, i4] + a[5, i5];
            if (s mod 5 = 0) and (s < sMin) then 
              sMin := s
          end;
  if (sMin = 100000) then 
    sMin := 0; 
  writeln(sMin)
end.

Анализ пар, находящихся на расстоянии

27_3: Разбор 27 задания демоверсии 2019 года (ФИПИ):

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

 
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен).
Необходимо определить количество таких пар, для которых произведение элементов делится на 29.

Описание входных и выходных данных:
В первой строке входных данных задаётся количество чисел N (4 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.

Пример входных данных:

7
58
2
3
5
4
1
29

Пример выходных данных для приведённого выше примера входных данных:

5
Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений:

 
58·4 = 232     :29=8
58·1 = 58      :29=2
58·29 = 1682   :29=58
2·1 = 2
2·29 = 58      :29=2
3·29 = 87      :29=3

Из них на 29 делятся 5 произведений.

Требуется написать эффективную по времени и памяти программу для решения описанной задачи.

Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

✎ Программа на языке Паскаль (версия PascalABC). Программа неэффективна ни по времени, ни по памяти (2 балла):

  • Перебор всех вариантов произведений:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    const
      s = 4;//требуемое расстояние
     
    var
      n, i, j, cnt: integer;
      a: array[1..1000] of integer;
     
    begin
      readln(n);
      cnt := 0;
      for i := 1 to n do
        readln(a[i]);
      for i := 1 to n - s do
        for j := i + s to n do
          if a[i] * a[j] mod 29 = 0 then
            cnt := cnt + 1;
      writeln(cnt)
    end.

✎ Программа на языке Паскаль (версия PascalABC). Программа эффективна и по времени, и по памяти (4 балла):

  • Если один из сомножителей делится без остатка на 29, то произведение с любым другим сомножителем тоже будет делится на 29.
  • Последние рассматриваемые 4 элемента можно хранить как 4 счётчика: количество делящихся на 29 среди всех считанных чисел, всех считанных чисел без последнего, всех считанных чисел без 2 последних, всех считанных чисел без 3 последних, – и также сдвигать их после очередного шага.
  • 1
    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
    30
    31
    
    const
      s = 4;//требуемое расстояние
     
    var
      n,i: integer;
      n1, n2, n3, n4: integer; //хранение последних s счетчиков
      a_: integer; //очередное значение
      cnt: integer;//количество искомых пар
     
    begin
      readln(n);
      n1 := 0;n2 := 0;n3 := 0;n4 := 0;
      cnt := 0;
      for i := 1 to n do 
      begin
        readln(a_); // очередное значение
        if i > s then
          if a_ mod 29 = 0 then
            cnt := cnt + (i - s)
          else
            cnt := cnt + n4;
        // сдвигаем элементы счетчика
        n4 := n3;
        n3 := n2;
        n2 := n1;
        // обновляем счетчик кратных 29
        if a_ mod 29 = 0 then
          n1 := n1 + 1;
      end;
      writeln(cnt)
    end.

📹 Видео

Видео на RuTube здесь


27_5:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!

  
Датчик передаёт каждую секунду по каналу связи неотрицательное целое число, не превосходящее 1000, — текущий результат измерений. Временем, в течение которого происходит передача, можно пренебречь.
Необходимо найти в заданной серии показаний датчика минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 8 секунд. Если получить такое произведение не удаётся, ответ считается равным -1. Общее количество показаний датчика в серии не превышает 10 000.

Вам предлагаются два задания, связанных с этой задачей: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору.
Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание — 0 баллов.
Задание Б является усложнённым вариантом задания А, оно содержит дополнительные требования к программе.

А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования.

ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ А. Максимальная оценка за выполнение задания А — 2 балла.


Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик). Программа считается эффективной по времени, если время работы программы пропорционально количеству полученных показаний прибора N, т. е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа А и не превышает 1 килобайта.
Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.

ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ Б. Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.

Пример входных данных:

10
5 4
3 2 1
6
7
8 9
4

Программа должна вывести одно число — описанное в условии произведение, либо -1, если получить такое произведение не удаётся.
Пример выходных данных для приведённого выше примера входных данных:

16
Показать решение:

* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
    ✎ Задание А (решение на языке Паскаль, версия pascalABC):
    Ниже приводится пример переборного решения на Паскале, неэффективного ни по памяти, ни по времени, но являющегося правильным ответом на задание А.

    const
      s = 8;{требуемое расстояние между показаниями} 
     
    var
      N: integer;
      a: array[1..10000] of integer; {все показания датчика} 
      mp: integer; {минимальное значение произведения} 
      i, j: integer;
     
    begin
      readln(N);
      {Ввод значений датчика} 
      for i := 1 to N do 
        readln(a[i]); 
      mp := 1000 * 1000 + 1;
      for i := 1 to N - s do 
      begin
        for j := i + s to N do 
        begin
          if (a[i] * a[j] mod 2 = 0) and (a[i] * a[j] < mp) then 
            mp := a[i] * a[j]
        end;
      end;
      if mp = 1000 * 1000 + 1 then 
        mp := -1; 
      writeln(mp)
    end.

✎Задание Б (решение на языке Паскаль, версия pascalABC):

Чтобы произведение было чётным, хотя бы один сомножитель должен быть чётным, поэтому при поиске подходящих произведений чётные показания прибора можно рассматривать в паре с любыми другими, а нечётные — только с чётными.

Для каждого показания с номером k, начиная с k = 9, рассмотрим все допустимые по условиям задачи пары, в которых данное показание получено вторым. Минимальное произведение из всех этих пар будет получено, если первым в паре будет взято минимальное подходящее показание среди всех, полученных от начала приёма и до показания с номером k — 8. Если очередное показание чётное, минимальное среди предыдущих может быть любым, если нечётное — только чётным.

Для получения эффективного по времени решения нужно по мере ввода данных помнить абсолютное минимальное и минимальное чётное показание на каждый момент времени, каждое вновь полученное показание умножать на соответствующий ему минимум, имевшийся на 8 элементов ранее, и выбрать минимальное из всех таких произведений. Ниже приводится пример такой программы на Паскале, эффективной по памяти и по времени.

const
  s = 8; {требуемое расстояние между показаниями}
  amax = 1001;{больше максимально возможного показания}
 
var
  N: integer;
  a: array[1..s] of integer; {хранение s показаний датчика} 
  a_: integer; {ввод очередного показания} 
  ma: integer; {минимальное число без s последних} 
  me: integer; {минимальное чётное число без s последних} 
  mp: integer; {минимальное значение произведения} 
  p: integer;
  i, j: integer;
 
begin
  readln(N);
  {Ввод первых s чисел}
  for i := 1 to s do readln(a[i]);
  {Ввод остальных значений, поиск минимального произведения} 
  ma := amax;me := amax;mp := amax * amax;
  for i := s + 1 to N do 
  begin
    readln(a_);
    if a[1] < ma then ma := a[1];
    if (a[1] mod 2 = 0) and (a[1] < me) then me
    := a[1];
    if a_ mod 2 = 0 then p := a_ * ma
    else if me < amax then p := a_ * me
    else p := amax * amax;
    if (p < mp) then mp := p;
    {сдвигаем элементы вспомогательного массива влево}
    for j := 1 to s - 1 do
      a[j] := a[j + 1];
    a[s] := a_
  end;
  if mp = amax * amax then mp := -1;
  writeln(mp)
end.

Информатика ЕГЭ 19, 20 и 21 задания разбор

19-е задание: «Анализ алгоритма логической игры»
Уровень сложности — повышенный,
Требуется использование специализированного программного обеспечения — нет,
Максимальный балл — 1,
Примерное время выполнения — 6 минут.
  
Проверяемые элементы содержания: Умение анализировать алгоритм логической игры
20-е задание: «Поиск выигрышной стратегии»
Уровень сложности — повышенный,
Требуется использование специализированного программного обеспечения — нет,
Максимальный балл — 1,
Примерное время выполнения — 6 минут.
  
Проверяемые элементы содержания: Умение найти выигрышную стратегию игры
21-е задание: «Дерево игры для выигрышной стратегии»
Уровень сложности — повышенный,
Требуется использование специализированного программного обеспечения — нет,
Максимальный балл — 1,
Примерное время выполнения — 10 минут.
  
Проверяемые элементы содержания: Умение построить дерево игры по заданному алгоритму и найти выигрышную стратегию
До ЕГЭ 2021 года — эти задания были объединены в задание № 26 ЕГЭ

Плейлист видеоразборов задания на YouTube:


Игра с двумя кучами камней или табличка

Задание демонстрационного варианта 2022 года ФИПИ

19_8:

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 59. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 59 или больше камней.
В начальный момент в первой куче было 5 камней, во второй куче – S камней; 1 ≤ S ≤ 53.

Задание 19 ЕГЭ.
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
  
Задание 20 ЕГЭ.
Найдите минимальное значение S, при котором у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.

  
Задание 21 ЕГЭ.
Найдите два значения S, при которых одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Найденные значения запишите в ответе в порядке возрастания.

Показать решение:

✎ Задание 19:

  • Нарисуем таблицу, в первом столбце которой будем откладывать количество камней в первой куче, а в первой строке — количество камней во второй куче. Получим матрицу. Поскольку в первой куче количество начинается с 5, то это и будет первым значением в таблице. Во второй куче начнем с наибольшего возможного числа — 53. Таблица пригодится для решения заданий 20 и 21:
  • 19 егэ с таблицей

  • Для начала найдем все выигрышные позиции для первой строки таблицы, т.е. для первого хода. Обозначим их плюсами (+):
  • 19 задание 2 кучи

    Выигрышные позиции для первой строки ищем по принципу увеличения количества камней S в 2 два раза: 5 + S*2 >=59. Получим S>=27
  • Для того, чтобы получить наименьшее значение S, в качестве первого хода Пети необходимо увеличивать в два раза вторую кучу. Т.е. для решения задания необходимо найти такое наименьшее S, при котором Петя походил неверно, и попал своим ходом в выигрышную позицию для своего соперника, т.е. в ячейку с плюсом:
  • S = 14
    1 ход Петя: 14*2 = (5,28)
    2 ход Ваня: 28*2 = (5,56), Сумма = 61, Выигрыш! 
    

Ответ: 14
  
✎ Задание 20:

  • Проанализируем таблицу, и для каждой строки найдем выигрышные позиции с одного хода. Т.е. которые позволят игроку, оказавшемуся «на них», выиграть за один ход (получить суммарно 59 и более камней):
  • 20 задание егэ

    При заполнении таблицы выигрышными позициями можно проследить закономерность «узора», а заполнять позиции по аналогии.
  • Найдем проигрышные позиции: те, которые ведут только в выигрышные позиции для соперника (ведут только в плюсы)
  • Проигрышные позиции: (6,26) (8,25) (10,24) (12,23) (14,22)
  • В задании требуется найти минимальное S, котором выиграет Петя, но выиграет он НЕ первым своим ходом, а вторым. То есть в нашем случае необходимо найти S, которое может перевести соперника в проигрышную позицию. То есть в минус. Для первой строки (так как первым будет ходить Петя) таких значений два:
  • Наименьшее S = 24

Ответ: 24
 
✎ Задание 21:

  • Для решения этого задания найдем выигрышные позиции со второго хода, т.е. которые могут перевести соперника в проигрышную позицию (с минусом):
  • Чтобы выиграл Ваня, но выиграл не первым ходом, а вторым, необходимо, чтобы Петя находился в такой позиции, которая ведет его только на выигрышные позиции со второго хода:

Ответ: 23 25


19_9:

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя.
За один ход игрок может убрать из одной из куч один камень или уменьшить количество камней в куче в два раза (если количество камней в куче нечётно, остаётся на 1 камень больше, чем убирается).

Например, пусть в одной куче 6, а в другой 9 камней; такую позицию мы будем обозначать (6, 9). За один ход из позиции (6, 9) можно получить любую из четырёх позиций: (5, 9), (3, 9), (6, 8), (6, 5).

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не более 20. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 20 или меньше камней. В начальный момент в первой куче было 10 камней, во второй куче – S камней, S > 10.

Задание 19 ЕГЭ.
Найдите значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
  
Задание 20 ЕГЭ.
Найдите минимальное и максимальное значение S, при котором у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
− Петя не может выиграть за один ход;
− Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
Найденные значения запишите в ответе в порядке возрастания.
  
Задание 21 ЕГЭ.
Найдите значение S, при котором одновременно выполняются два условия:
– у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
– у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

Ответы:
21
22 44
24

Показать решение (Excel):

✎ Задание 19:

  • В столбце А отложим значения — количество камней в первой куче. Начнем с ячейки А2, в которую внесем начальное количество камней, т.е. 10. Автозаполнением продлим значения вниз до 0:
  • В строке 1 таблицы (начиная с ячейки B1) отложим значения для второй кучи. Поскольку в задании говорится, что победа будет достигнута при S<=20, и достигнуть этого значения более сильной командой можно уменьшив кол-во камней во второй куче в два раза, начиная с числа 40: 40/20. То есть возьмем значение больше 40, примерно 45. Используем автозаполнение до значения 11:
  • Из двух команд, которые могут выполнять игроки, выберем наиболее сильную, т.е. благодаря которой можно быстрее достичь выигрышного диапазона и попасть в значения S<=20. Это команда уменьшения количества камней в два раза, т.е. /2.
  • Для каждой из ячеек полученной таблицы рассчитаем значение, полученное в результате уменьшения в два раза той кучи камней, в которой большее количество камней (так как это даст меньший результат). Например, для ячейки С5, в которой игрок имеет в первой куче 7 камней, а во второй куче 44 камня, мы бы выполнили действие 44/2+7. Т.е. уменьшили вдвое вторую кучу, т.к. в ней больше камней. Еще необходимо обращать внимание на четность и нечетность значений (в Excel это функция ЕНЕЧЁТ — возвращает ИСТИНУ, если значение нечетно).
  • Чтобы автоматизировать процесс необходимо использовать формулу, в которой найдем максимальное значение из двух вариантов:
  • Минимальное из
    (ЕСЛИ(ЕНЕЧЁТ(1-я куча) то (1-я куча+1)/2+2-я куча, 
    иначе 1-я куча/2+2-я куча);
    ЕСЛИ(ЕНЕЧЁТ(2-я куча) то (2-я куча+1)/2+1-я куча, 
    иначе 2-я куча/2+1-я куча)).
    
  • Выразив это в формуле Excel, получим результат, который внесем в ячейку B2:
  •  = МИН(ЕСЛИ(ЕНЕЧЁТ($A2);($A2+1)/2+B$1;$A2/2+B$1);ЕСЛИ(ЕНЕЧЁТ(B$1);(B$1+1)/2+$A2;B$1/2+$A2))
  • Здесь знак $ будем использовать для фиксации столбца А и строки 1 при копировании формулы.
  • Скопируем формулу на всю таблицу.
  • Выделим всю таблицу и используем Условное форматирование для выделения тех значений, которые попадают в выигрыш (<21):
  • Выделенные значения — это значения, которые можно получить в сумме двух куч, выполнив ход из данной ячейки. И по сути, это и есть выигрышные позиции с 1 хода.
  • Далее следуем логике рассуждения: Ваня сможет выиграть своим первым ходом в том случае, если Петя оказывается РЯДОМ с выигрышной позицией, и любой его ход попадает ТОЛЬКО в выигрышные позиции для Вани (в выделенную область). Это позиция при S = 21:

Ответ: 21
✎ Задание 20:

  • Продолжаем работать с той же таблицей, что и в задании 19. Выделим все проигрышные позиции (из которых можно походить только в выигрышные позиции для соперника, т.е. в выделенные ячейки):
  • Петя может выиграть свои вторым ходом, если он не может выиграть первым ходом, но может выполнить ход в позицию, проигрышную для соперника (в ячейку, выделенную красным). Такие позиции назовем выигрышные позиции со второго хода. Найдем минимальное и максимальное значение S при таком первом ходе Пети:
  • При S=44 Пете необходимо уменьшить 2-ю кучу вдвое (44/2 = 22), чтобы оказаться в проигрышной позиции для соперника.

Ответ: 22 44
  
✎ Задание 21:

  • Выделим все такие выигрышные позиции со второго хода:
  • Далее придерживаемся следующей логики: Ваня сможет выиграть свои первым или вторым ходом, но при этом не гарантированно первым ходом, если у Пети будет возможность выполнить ходы только в позиции выигрышные со второго хода. Найдем такое S:
  • При S = 24 Петя сможет уменьшить кучи на один камень, и тогда оказывается в выделенной зеленой области — выигрышные позиции со второго хода для Вани, либо уменьшить количество камней вдвое, и тогда Ваня оказывается в выигрышной позиции с первого хода (розовая область).

Ответ: 24


19_7:

Два игрока, Петя и Ваня, играют в следующую игру. На табличке написаны два значения. Оба игрока в свой ход могут заменить одно из значений на сумму обеих (по своему выбору). Первый ход делает Петя. Игра считается законченной когда сумма обеих значений равняется не меньше 56. То есть выигрывает игрок, получивший 56 или более в сумме. Начальное значение (10, S).

Задание 19 ЕГЭ.
Найдите максимальное S при котором Петя не может выиграть первым ходом.
  
Задание 20 ЕГЭ.
У кого из игроков есть выигрышная стратегия при начальном значении (9, 15).
  
Задание 21 ЕГЭ.
У кого из игроков есть выигрышная стратегия при начальном значении (3,7)? Опишите эту стратегию и изобразите дерево всех возможных партий при этой стратегии.

Типовые задания для тренировки

Показать решение:

  • Задание 19.
    Максимальное S при котором Петя НЕ может выиграть своим первым ходом S = 22. Петя проиграет, если в сумме получится 55 и меньше. Первое значение = 10, необходимо найти второе значение, при этом максимальное. Схематично отобразим варианты ходов:
  • (10,22) - ход Пети - (10+22, 22) - итог суммы обеих значений таблички: 32 + 22 = 54 (<56)
    Для того, чтобы сделать сумму большей, Петя заменит первое значение на сумму, так как оно меньше второго значения (10<22)
  • Задание 20.
    В начальной позиции (9, 15) выигрышная стратегия есть у Вани. Для себя отобразим схематично выигрышную партию Вани:
  • дерево выигрышной партии Вани

    Зеленым цветом выделены выигрышные ходы.
  • Задание 21.
    В начальной позиции (3, 7) выигрышная стратегия есть у Вани. Изобразим дерево всех возможных партий при этой стратегии (раз говорится "при этой стратегии" имеем в виду, выигрышную стратегию Вани):
  • дерево всех возможных при этой стратегии партий

    Дерево для выигрышной стратегии Вани: для Вани отображены только ходы по стратегии, для Пети - все возможные ходы. Зеленым цветом - выигрышный ход, красная обводка - ход по стратегии.

19_6:

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

В начальный момент в первой куче было 5 камней, во второй куче – S камней; 1 ≤ S ≤ 38
Задание 19.
При каких S: 1а) Петя выигрывает первым ходом; 1б) Ваня выигрывает первым ходом?
  
Задание 20.
Назовите одно любое значение S, при котором Петя может выиграть своим вторым ходом.
  
Задание 21.
Назовите значение S, при котором Ваня выигрывает своим первым или вторым ходом.

Показать решение:

  • Нарисуем таблицу, в первом столбце которой будем откладывать количество камней в первой куче, а в первой строке - количество камней во второй куче. Получим матрицу. Поскольку в первой куче количество начинается с 5, то это и будет первым значением в таблице. Во второй куче начнем с наибольшего возможного числа - 38:
  • 19 егэ
     
    Задание 19 а):

  • Далее будем рассуждать так: Петя может выиграть первым ходом, выполнив команду *2 (увеличить количество камней в куче в два раза), если вместо S (кол-во камней во второй куче), мы будем изменять значение, начиная от 20, до последнего возможного по условию значения 38:
  • 5 + 20*2 = 45 (>44)
    
    * 5 - кол-во камней в первой куче, оно не меняется по условию
    
  • Соответственно, все значения большие 20 дадут в результате число большее 44. Укажем это в таблице. + означает выигрышную позицию с первого хода:

  • Ответ 1 а): S = [20;38] (На ЕГЭ пояснить ходы, например: (5; 20) -> (Ход Пети)-> (5;40); 40 + 5 = 45)
      
    Задание 19 б):

  • Поскольку Ваня будет ходить вторым, то необходимо поменять количество камней и в первой куче. Значит рассмотрим ситуации, что Петя мог бы ходить первым ходом в (7;S) и в (10;S). Укажем, будут ли эти позиции выигрышные с одного хода: например (7;19) выигрышная позиция, т.к. игрок выполнит ход в (7;38) и выиграет (7 + 38 = 45). Соответственно, выигрышными являются и все позиции (7;больше 19). Проанализируем таблицу, увеличивая количество камней в первой куче и выполняя поиск выигрышных позиций с одного хода:
  • решение 19 егэ про две кучи камней

  • Последующая логика рассуждений: Ваня может выиграть своим первым ходом, когда Петя своим первым ходом сможет ходить только в выигрышные позиции с первого хода (в +). Отметим такие позиции, учитывая, что это первый ход Пети, и кол-во камней в первой куче должно быть 5. Найденные позиции будут проигрышными позициями (-):
  • Находим единственное такое значение - (5; 19). Т.е. S = 19.
  • Ответ 1 б): S = 19 (На ЕГЭ пояснить ходы, например: (5; 19) -> (Ходы Пети): (5;21),(5;28);(7;19);(7;28). Везде следующим ходом выиграет Ваня, см. предыдущ. пункт)
      
    Задание 20:

  • Обратим внимание, что в таблице, все образовавшиеся "уголки" являются проигрышными позициями (с 1-го хода): то есть если игрок, оказывается в такой позиции, то он может выполнить ход только в выигрышные позиции (то есть следующим ходом выиграет соперник):
  • Логика рассуждений: Петя сможет выиграть своим вторым ходом, когда своим первым ходом он попадет в проигрышную позицию, т.е. переведет соперника в проигрышную ситуацию. Такие значения: S = 16, 17 или 18. Назовем эти позиции выигрышными со второго хода (2+):

Ответ 2: S = 16, 17 или 18 (На ЕГЭ пояснить ходы, ссылаясь на объяснения в предыдущих пунктах)
 
Задание 21:

  • Укажем в таблице также позиции, выигрышные с n-го хода: когда игрок может перевести соперника в проигрышную позицию:
  • Укажем также проигрышные позиции со второго хода: игрок, оказавшийся в такой позиции может выполнить ход только на выигрышные позиции (тогда соперник выиграет):
  • Логика рассуждений: Ваня сможет выиграть своим первым или вторым ходом, когда Петя своим первым ходом может попасть только либо в позицию выигрышную с первого хода (+), либо в позицию выигрышную со второго хода или n-го хода (2+). Это позиция при S = 14:

  • Ответ 3: S = 14 (На ЕГЭ пояснить ходы, ссылаясь на объяснения в предыдущих пунктах)

    📹 Видео

    Видеорешение на RuTube здесь


    Задания для тренировки 19, 20, 21 заданий ЕГЭ (взяты из КИМ и сборников прошлых лет)

    Игра с одной кучей камней

    19_3. Демоверсия ЕГЭ 2018 информатика:

    Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Например, имея кучу из 15 камней, за один ход можно получить кучу из 16 или 30 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.

    Игра завершается в тот момент, когда количество камней в куче становится не менее 29. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 28.

    Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока - значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

    Задание 19 ЕГЭ
    а) Укажите такие значения числа S, при которых Петя может выиграть в один ход.
    б) Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом. Опишите выигрышную стратегию Вани.

    Задание 20 ЕГЭ
    Укажите два таких значения S, при которых у Пети есть выигрышная стратегия, причем:
    - Петя не может выиграть за один ход;
    - Петя может выиграть своим вторым ходом независимо от того, как будет ходить Ваня.
    Для указанных значений S опишите выигрышную стратегию Пети.

    Задание 21 ЕГЭ
    Укажите значение S, при котором:
    - у Вани есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
    - у Вани нет стратегии, которая позволит ему гарантированно выиграть первым ходом.

    Для указанного значения S опишите выигрышную стратегию Вани. Постройте дерево всех партий, возможных при этой выигрышной стратегии (в виде рисунка или таблицы). На ребрах дерева указывайте, кто делает ход; в узлах — количество камней в позиции

    Дерево не должно содержать партий, невозможных при реализации выигрывающим игроком своей выигрышной стратегии. Например, полное дерево игры не является верным ответом на это задание.

    Показать решение:

      Задание 19.

    • а) Петя может выиграть, если S = 15, ... 28
    • 15, ..., 28 - выигрышные позиции с первого хода
      
    • б) Ваня может выиграть первым ходом (как бы ни играл Петя), если в куче будет S = 14 камней. Тогда после первого хода Пети в куче будет 15 или 28 камней. В обоих случаях Ваня удваивает кучу и выигрывает в один ход.
    • S = 14
      Петя: 14 + 1 = 15  выигрышная позиция (см. п. а). Выигрывает Ваня
      Петя: 14 * 2 = 28   выигрышная позиция (см. п. а). Выигрывает Ваня
      
      14 - проигрышная позиция
      

      Задание 20.

    • Возможные значения S: 7, 13. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако он может получить кучу из 14 камней: в первом случае удвоением, во втором - добавлением одного камня. Эта позиция разобрана в п. 1б. В ней игрок, который будет ходить (теперь это Ваня), выиграть не может, а его противник (то есть Петя) следующим ходом выиграет.
    • S = 7
      Петя: 7 * 2 = 14  проигрышная позиция (см. п. 1 б). Выигрывает Петя
      S = 13
      Петя: 13 + 1 = 14 проигрышная позиция (см. п. 1 б). Выигрывает Петя
      
      7, 13 - выигрышные позиции со второго хода
      

      Задание 21.

    • Возможные значения S: 12. После первого хода Пети в куче будет 13 или 24 камня. Если в куче их станет 24, Ваня удвоит количество камней и выиграет первым ходом. Ситуация, когда в куче 13 камней, разобрана в п. 2. В этой ситуации игрок, который будет ходить (теперь это Ваня), выигрывает своим вторым ходом.
    • S = 12
      Петя: 12 + 1 = 13  
      Ваня: 13 + 1 = 14 проигрышная позиция (см. п. 1 б). Выигрывает Ваня вторым ходом!
      

      В таблице изображено дерево возможных партий (и только их) при описанной стратегии Вани. Заключительные позиции (в них выигрывает Ваня) подчеркнуты. На рисунке это же дерево изображено в графическом виде.
      таблица выигрышных стратегий
      Дерево всех партий, возможных при стратегии Вани:
      дерево выигрышных стратегий
      * красный круг означает выигрыш



    19_4: Досрочный егэ по информатике 2018, вариант 1:

    Два игрока, Паша и Вася, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Паша. За один ход игрок может добавить в кучу один или четыре камня или увеличить количество камней в куче в пять раз. Игра завершается в тот момент, когда количество камней в куче становится не менее 69.
    Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 69 или больше камней. В начальный момент в куче было S камней, 1 ≤ S ≤ 68.

    Задание 19 ЕГЭ.
    а) Укажите все такие значения числа S, при которых Паша может выиграть в один ход. Обоснуйте, что найдены все нужные значения S, и укажите выигрывающий ход для каждого указанного значения S.
      
    б)Укажите такое значение S, при котором Паша не может выиграть за один ход, но при любом ходе Паши Вася может выиграть своим первым ходом. Опишите выигрышную стратегию Васи.
      
    Задание 20 ЕГЭ. Укажите 2 таких значения S, при которых у Паши есть выигрышная стратегия, причём Паша не может выиграть за один ход и может выиграть своим вторым ходом независимо от того, как будет ходить Вася. Для каждого указанного значения S опишите выигрышную стратегию Паши.
     
    Задание 21 ЕГЭ. Укажите хотя бы одно значение S, при котором у Васи есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Паши, и у Васи нет стратегии, которая позволит ему гарантированно выиграть первым ходом. Для указанного значения S опишите выигрышную стратегию Васи. Постройте дерево всех партий, возможных при этой выигрышной стратегии Васи (в виде рисунка или таблицы).
      
    Типовые задания для тренировки

    Показать решение:

      19.
      а) S ≥ 14. При количестве камней в куче от 14 и выше Паше необходимо увеличить их количество в пять раз, тем самым получив 70 или более камней.

      S ≥ 14 выигрышные позиции
      

       
      б) S = 13. Паша своим первым ходом может сделать 14, 17 или 65 камней, после этого Вася увеличивает количество в пять раз, получая 70, 85 или 325 камней в куче.

      S = 13 
      Паша 1 ход: 13 + 1 = 14
      Паша 1 ход: 13 + 4 = 17
      Паша 1 ход: 13 * 5 = 65
      
      Ваня 1 ход: [14, 17, 65] * 5 = S ≥ 14  Ваня выигрывает
      
      13 - проигрышная позиция
      

      20. S = 9, 12. Для данных случаев Паше необходимо прибавить 4 камня к куче из 9 камней, либо 1 камень к куче из 12, и получить кучу из 13 камней.
      После чего игра сводится к стратегии, описанной в пункте .

      S = 13 
      Паша 1 ход: 9 + 4 = 13  Паша выигрывает
      Паша 1 ход: 12 + 1 = 13 Паша выигрывает
      
      9, 12 - выигрышные позиции со второго хода
      

      21. S = 8. Своим первым ходом Паша может сделать количество камней в куче 9, 12 или 40. Если Паша увеличивает кол-во в пять раз, тогда Вася выигрывает своим первым ходом, увеличивая количество камней в пять раз.
      Для случая 9 и 12 камней Вася использует стратегию, указанную в п.2.

      S = 8 
      Паша 1 ход: 8 + 1 = 9   Ваня Выигрывает (см. п.2)
      Паша 1 ход: 8 + 4 = 12  Ваня Выигрывает (см. п.2)
      Паша 1 ход: 8 * 5 = 40  
      

      дерево решение 19 задание егэ

    📹 Видео (аналитическое решение)

    Видеорешение на RuTube здесь


    19_1:

    Два игрока, Паша и Валя, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Паша. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Например, имея кучу из 7 камней, за один ход можно получить кучу из 14 или 8 камней. У каждого игрока, чтобы сделать ход, есть неограниченное количество камней.

    Игра завершается в тот момент, когда количество камней в куче становится не менее 28. Если при этом в куче осталось не более 44 камней, то победителем считается игрок, сделавший последний ход. В противном случае победителем становится его противник. Например, если в куче было 23 камня, и Паша удвоит количество камней в куче, то игра закончится и победителем будет Валя. В начальный момент в куче было S камней, 1≤ S ≤ 27.

    Задание 1
    а) При каких значениях числа S Паша может выиграть в один ход? Укажите все такие значения и соответствующие ходы Паши.
    б) У кого из игроков есть выигрышная стратегия при S = 26, 25, 24? Опишите выигрышные стратегии для этих случаев.

    Задание 2
    У кого из игроков есть выигрышная стратегия при S = 13, 12? Опишите соответствующие выигрышные стратегии.

    Задание 3
    У кого из игроков есть выигрышная стратегия при S = 11? Постройте дерево всех партий, возможных при этой выигрышной стратегии (в виде рисунка или таблицы). На ребрах дерева указывайте, кто делает ход; в узлах - количество камней в позиции.

    Показать решение:

    1. а) Паша имеет выигрышную стратегию и может выиграть за один ход, если S = 27: тогда ему достаточно добавить один камень, чтобы игра закончилась при 28 камнях в куче; или если S = 14, 15, 16, 17, 18, 19, 20, 21, 22 (44/2 = 22 и 28/2 = 14, т.е. от 14 до 22): тогда необходимо удвоить кучу.

      S=27
      Паша: 27 + 1 = 28 - Выигрыш!
      
      27 - выигрышная позиция
      

      б) При S = 26 выигрышная стратегия есть у Вали. Паша делает ход первым, у него есть возможность либо удвоить количество камней в куче, и тогда количество превысит 44, - выигрывает Валя; либо увеличить количество на один камень, станет 27 камней: следующая Валя, - она может положить один камень и выиграть.

      S=26
      Паша: 26 * 2 = 52   Валя выигрывает! или:
      Паша: 26 + 1 = 27
      Валя: 27 + 1 = 28 - Выигрыш! 
      
      26 - проигрышная позиция
      

      При S = 25 выигрышная стратегия есть у Паши. Удваивать количество камней нет смысла, т.к. количество превысит 44, значит, Паша добавит один камень, их станет 26, следующая Валя, — она может либо добавить камень (станет 27 камней, следующим ходом выиграет Паша) либо удвоить — и сразу проиграть, т.к. станет более 44 камней.

      S=25
      Паша: 25 + 1 = 26
      Валя: 26 ...  проигрышная позиция (см. выше) Паша выигрывает!
      
      25 - выигрышная позиция
      

      При S = 24 выигрышная стратегия есть у Вали. Паша делает ход первым: удваивать кучу нет смысла, т.к. в ней станет более 44, значит, Паша добавит один камень, их станет 25; следующая — Валя: она может только добавить один камень (станет 26 камней, следующим ходом Паша оказывается в проигрышной позиции, см. пункт при S = 26).

      S=24
      Паша: 24 + 1 = 25 
      Валя: 25 ...  выигрышная позиция (см. выше) Валя выигрывает!
       
      24 - проигрышная позиция
      
    2. При S = 13 или S = 12 выигрышная стратегия есть у Паши. Паша удваивает количество и в куче остается 26 или 24 камня. Это проигрышная позиция для того, кто ходит (см. п. 1 б), а следующий ход за Валей.
    3. При S = 11 выигрышная стратегия есть у Вали. Паша делает первый ход: в куче остается либо 22, либо 12 камней. Обе эти позиции выигрышные для того, кто ходит. При S = 12 последовательность игры описана в пункте 2, а при S = 22 - в пункте .

        
      Дерево возможных партий:
      задание 19 егэ дерево игры

      * Для Вали отображены только ходы по стратегии
      ** красный круг означает выигрыш
      *** фиолетовый круг - конец игры (проигрыш)

    📹 Видео (аналитическое решение)
    Видеорешение на RuTube здесь


    Задания с двумя кучами камней или табличка

    19_5:

    Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 73.
    Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, что в кучах всего будет 73 камня или больше.
     
    Задание 1.
    Для каждой из начальных позиций (6, 33), (8, 32) укажите, кто из игроков имеет выигрышную стратегию. В каждом случае опишите выигрышную стратегию; объясните, почему эта стратегия ведёт к выигрышу, и укажите, какое наибольшее количество ходов может потребоваться победителю для выигрыша при этой стратегии.
      
    Задание 2.
    Для каждой из начальных позиций (6, 32), (7, 32), (8, 31) укажите, кто из игроков имеет выигрышную стратегию.
      
    Задание 3.
    Для начальной позиции (7, 31) укажите, кто из игроков имеет выигрышную стратегию. Постройте дерево всех партий, возможных при указанной вами выигрышной стратегии. Представьте дерево в виде рисунка или таблицы.

    Показать решение:

    • Задание 1. В начальных позициях (6, 33), (8, 32) выигрышная стратегия есть у Вани.
    • Задание 2. В начальных позициях (6, 32), (7, 32) и (8, 31) выигрышная стратегия есть у Пети.
    • Задание 3. В начальной позиции (7, 31) выигрышная стратегия есть у Вани.
    • дерево выигрышной стратегии

    📹 Видео (аналитическое решение)

    Видеорешение на RuTube здесь


    Игра с набором слов

    19_2:

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

    Например, есть набор слов {Волк, Информатика, Страшно}; для заданного набора слов Петя своим первым ходом может назвать букву В, И или С. Если Петя выберет букву В, то победит Ваня (следующие ходы: Петя - В, Ваня - О, Петя - Л, Ваня - К).

      
    Задание 1
    А) Даны 2 слова (набора букв) {ИКЛМНИКЛМНХ, НМЛКИНМЛКИ}. Определить выигрышную стратегию.

    Б) Даны 2 слова {ТРИТРИТРИ...ТРИ, РИТАРИТАРИТАРИТА...РИТА}. В первом слове 99 букв, во втором 164. Определить выигрышную стратегию.

    Задание 2
    Необходимо поменять две буквы местами из набора пункта в слове с наименьшей длинной так, чтобы выигрышная стратегия была у другого игрока. Объяснить выигрышную стратегию.

    Задание 3
    Дан набор слов {Ворона, Волк, Волна, Производная, Прохор, Просо}. У кого из игроков есть выигрышная стратегия? Обосновать ответ и написать дерево всех возможных партий для выигрышной стратегии.

    Показать решение:

    1. А) Для выигрыша Пете достаточно выбрать первую букву слова с нечетным количеством букв, тогда последний ход делает Петя. При исходном наборе слов выигрышная стратегия есть у Пети. Она заключается в том, что своим первым ходом он должен выбрать букву И (слово ИКЛМНИКЛМНХ из 11 букв). Ване придется выбрать букву К. Таким образом, они последовательно будут называть буквы первого слова, пока Петя не выберет последнюю букву Х. На этом игра закончится выигрышем Пети. При данной стратегии возможна только одна партия. Заключением партии будет написано слово ИКЛМНИКЛМНХ.

      Б) При исходном наборе слов выигрышная стратегия есть у Пети. Она заключается в том, чтобы выбрать слово с нечетным количеством букв, т.к. при такой стратегии последнюю букву в любом случае записывает Петя. Т.о., Петя должен выбрать букву Т, т.к. в первом слове 99 букв.

    2. Если поменять местами во втором слове (НМЛКИНМЛКИ) буквы Н и И, то получится следующий набор слов:
      {ИКЛМНИКЛМНХ, ИМЛКННМЛКИ}
      

      Для данного набора выигрышная стратегия есть у Вани. Петя в любом случае должен будет выбрать букву И, а Ваня следующим ходом может перевести игру в проигрышную позицию для Пети, т.е. перейти на второе слово, назвав букву М. Такая стратегия приведет Ваню к выигрышу, так как последнюю букву слова - И - запишет именно он.

    3. Выигрышная стратегия есть у Вани, так как при любом выборе Пети, Ваня может перевести игру в проигрышную позицию для Пети, т.е. "перейти" на слово с четным количеством букв. Такая стратегия позволит Ване написать последнюю букву и тем самым выиграть игру.
    4. Дерево возможных партий:
      дерево партий

    * Для Вани отображены только ходы по стратегии
    ** Красный круг означает выигрыш

    📹 Видео (аналитическое решение)

    Видеорешение на RuTube здесь


    старое Информатика ЕГЭ 25 задание разбор

    25-е задание: «Программная обработка целочисленной информации»
    Уровень сложности — высокий,
    Требуется использование специализированного программного обеспечения — да,
    Максимальный балл — 2,
    Примерное время выполнения — 20 минут.
      
    Проверяемые элементы содержания: Умение создавать собственные программы (10–20 строк) для обработки целочисленной информации

      
    Задание демонстрационного варианта 2021 года ФИПИ

    Задачи с поэлементной обработкой массива

    Разбор 25 задания ЕГЭ по информатике 2017 года (один из вариантов со слов выпускника):

    Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество элементов массива НЕ кратных 3.

    Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но использовать все описанные переменные не обязательно.

    1
    2
    3
    4
    5
    6
    7
    8
    
    const N = 20;
    var i,j,k:integer;
    a:array [1..N] of integer; 
    begin
    for i:=1 to N do 
      readln(a[i]);end.
    Показать решение:

    Рассмотрим заданный фрагмент решения:

    • в цикле со счетчиком i запрашиваются значения элементов массива, т.е. формируется массив;
    • из постановки задания видим, что необходимо найти количество чего-то, это значит, что нужно использовать переменную счетчик;
    • объявлены три целочисленных переменных: i, j, k; переменная i использована в первом цикле, значит для счетчика можно взять переменную k;
    • счетчик всегда нужно обнулять, поэтому следующим оператором будет:
    • k:=0;
    • определим, количество чего нам необходимо считать: количество элементов массива не кратных 3. Кратность можно определить через остаток от деления: если значение элемента массива при делении на 3 в остатке не возвращает 0, значит элемент не кратен трем;
    • остаток при делении в паскале — оператор mod. Поскольку необходимо просмотреть каждый элемент массива, то это нужно делать в цикле for;
    • переменная i уже использована в первом цикле for, значит, для очередного цикла возьмем неиспользованную переменную j:
    • for j:=1 to N do
        if a[j] mod 3 <> 0 then
    • если условие истинно (т.е. нашелся элемент массива, не кратный трем), то увеличиваем счетчик:
    •      inc(k);
    • после цикла остается вывести значение счетчика, т.е. вывести количество элементов массива не кратных 3:
    • writeln(k);

    Результат:

    k:=0;
    for j:=1 to N do
      if a[j] mod 3 <> 0 then
        inc(k);
    writeln(k);

    📹 Видео


    Решение 25 задания ЕГЭ по информатике Демоверсия 2018:

    Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на одном из языков программирования алгоритм, который находит количество элементов массива, больших 100 и при этом кратных 5, а затем заменяет каждый такой элемент на число, равное найденному количеству. Гарантируется, что хотя бы один такой элемент в массиве есть. В качестве результата необходимо вывести измененный массив, каждый элемент массива выводится с новой строчки.

    Например, для массива из шести элементов: 4 115 7 195 25 106
    программа должна вывести числа: 4 2 7 2 25 106

    Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    const
    N = 30;
    var
    a: array [1..N] of longint;
    i, j, k: longint;
    begin
    	for i := 1 to N do
    		readln(a[i]);
    	...
    end.

    В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.6). В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии.

    Похожие задания для тренировки

    Показать решение:

    • Решение на языке Паскаль:
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      
      k := 0;
      for i := 1 to N do
      	if (a[i] > 100) and (a[i] mod 5 = 0) then
      		k:=k+1;
      for i := 1 to N do begin
      	if (a[i] > 100) and (a[i] mod 5 = 0) then
      		a[i] := k;
      writeln(a[i])
      end

    25_6:

    Дан массив, содержащий неотрицательные целые числа. Необходимо вывести:

  • максимальный чётный элемент, если количество чётных элементов не меньше, чем нечётных;
  • максимальный нечётный элемент, если количество нечётных эле-ментов больше, чем чётных.
  • Например, для массива из шести элементов: 4 6 12 17 3 8
    ответом будет 12 — наибольшее чётное число, поскольку чётных чисел в этом массиве больше

    Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
      
    Python:

    1
    2
    3
    4
    5
    6
    
    # допускается также использовать
    # целочисленные переменные j, k, m
    a = []
    n = 2000 // менять значение n нельзя
    for i in range(0, n):
      a.append(int(input()))
    Показать решение:

      Решение на языке Python:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
      a = []
      n = 2000 // менять значение n нельзя
      for i in range(0, n):
          a.append(int(input()))
      j = 0 
      k = 0 
      m = 0 
      for i in range(0, n):
      	if a[i]%2 == 0:
      		j+=1
      	else:
      		k+=1
      if k>j:
      	j = 0
      	for i in range(0, n):
      		if a[i]>j and a[i] % 2 != 0:
      			j = a[i]
      	print(j)
      else:
      	for i in range(0, n):
      		if a[i]>m and a[i] % 2 == 0:
      			m = a[i]
      	print(m)

    Задачи на обработку пар элементов массива (два подряд идущих)

    25_4: Разбор 25 задания ЕГЭ по информатике 2019 года ФИПИ «Типовые экзаменационные варианты» вариант 10 (Крылов С.С., Чуркина Т.Е.):

    Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых одно из чисел двузначное. В данной задаче под парой подразумевается два подряд идущих элемента массива.

    Например, для массива из семи элементов: 13; 323; 12; 33; 117 — ответ: 4.

    Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
      
    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    const
      N = 40;
    var
      a: array [1..N] of integer;
      i, j, k: integer;
    begin
      for i := 1 to N do 
        readln(a[i]);
      ...
    end.
    Показать решение:

      1
      2
      3
      4
      5
      
      k := 0;
      for i := 1 to N - 1 do
       if ((a[i] < 100) and (a[i] > 9)) or ((a[i + l] < 100) and (a[i + 1] > 9)) then 
            inc(k);
      writeln(k);

    25_5:

    Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от -10 000 до 10 000 включительно. Опишите алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых сумма элементов делится на 2, но не делится на 4. В данной задаче под парой подразумевается два подряд идущих элемента массива.

    Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

    Python:

    1
    2
    3
    4
    5
    6
    7
    
    #  допускается также использовать
    #  две целочисленные переменные
    #  j и k
    a = []
    n = 20
    for i in range(0, n):
      a.append(int(input()))
    Показать решение:

      Проанализируем данный фрагмент кода на языке Python:

    • В первой строчке кода объявляется список а. Дальше, идет объявление переменной n = 20, она отвечает за размер массива.
    • При решении такого рода задач, необходимо помнить, что массив в Python — это список и это динамический тип данных. Кроме того, нумерация элементов массива начинается с 0.
    • Ниже мы видим инициализацию списка а. Мы должны дописать код дальнейшей программы, который последует после заполнения списка пользователем.
    • Итак, по условию мы должны находить пары элементов, сумма которых делится на 2, но не делится на 4, причем парами считаются соседние элементы, например: a[0] и a[1], a[1] и a[2].
    • Мы можем узнать, делится ли данный элемент на число, если остаток от деления на него равен 0, и не делится — в противном случае. Тогда сумма соседних элементов при делении на 2 должна давать остаток 0, а при делении на 4 наоборот — отличный от 0.
    • Введем цикл, который будет перебирать все элементы массива, считать сумму соседей и проверять истинность условия.
    • for i in range(0, n-1):
          j = a[i] + a[i+1]
          if j%2 == 0 and j%4 != 0:
      Так как мы рассматриваем элемент a[i + 1], значит, цикл должен работать до n — 1, чтобы не выйти за границы диапазона массива.
    • Когда мы определились с условием, за счетчик возьмем переменную k, которую допустимо брать исходя из комментариев к программе.
    • ...
       if j%2 == 0 and j%4 != 0:
              k+=1
    • Мы добавили допустимую переменную j, чтобы условный оператор выглядел компактнее.
    • Однако задача еще не решена. Во-первых, мы должны до цикла инициализировать счетчик k = 0. Так как иначе Python выдаст ошибку.
    • Дело в том, что мы пытаемся присвоить переменной k его же значение, но на 1 больше, но интерпретатор «не встречал» раньше переменной k, из-за чего возникает ошибка.
    • Кроме того, добавим вывод результата после цикла.
    • Таким образом, правильный вариант с учетом доработок:
    • a = []
      n = 20
      for i in range(0, n):
        a.append(int(input()))
      k = 0
      for i in range(0, n - 1):
          j = a[i] + a[i + 1]
          if j%2 == 0 and j%4 != 0:
              k += 1
      print(k)

    Задачи на обработку трёх подряд идущих элементов массива (тройки элементов массива)

    Разбор 25 задания ЕГЭ по информатике 2019 года ФИПИ вариант 11, «Типовые экзаменационные варианты» (Крылов С.С., Чуркина Т.Е.):

    Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество троек элементов массива, состоящих из равных между собой чисел. В данной задаче под тройкой подразумевается три подряд идущих элемента массива.

    Например, для массива из семи элементов: 2; 2; 2; 4; 4; 4; 4 — ответ: 3.

    Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    const
      N=40;
    var
      a: array[1..N] of integer;
      i, j, k:integer;
    begin
      for i:=1 to N do
        readln(a[i]);
      ...
    end.
    Показать решение:

    • из постановки задания видим, что необходимо искать количество чего-то, это значит, что нужно использовать переменную счетчик; возьмем для нее объявленную переменную k;
    • счетчик всегда нужно сначала обнулять, поэтому следующим оператором будет:
    • k:=0;
    • определим, количество чего нам необходимо считать: количество троек элементов массива, состоящих из равных между собой чисел. Т.е. необходимо сравнивать между собой каждые три подряд идущих элемента массива, например так:
    • if (a[i]=a[i+1]) and (a[i]=a[i+2]) then
          inc(k);
    • inc(k) — оператор, увеличивающий счетчик k на единицу;
    • условие необходимо выполнять в цикле, так как нужно проверить все элементы массива; цикл со счетчиком необходимо организовать от 1 до N-2, в противном случае индексы элементов a[i+2] выйдут за границы диапазона массива (например, при i = 40, получим … a[40+2], а 42-го элемента массива не существует, поэтому цикл надо делать до i = 38, т.е. N-2).

    Результат:

    for i:=1 to N-2 do
        if (a[i]=a[i+1]) and (a[i]=a[i+2]) then
          inc(k);
    writeln(k);

    📹 Видео


    Задачи на поиск максимума, минимума элементов массива и другие


    Информатика ЕГЭ 23 задание разбор про динамическое программирование и анализ алгоритмов

    23-е задание: «Динамическое программирование и анализ работы алгоритма»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 8 минут.
      
    Проверяемые элементы содержания: Умение анализировать результат исполнения алгоритма
    До ЕГЭ 2021 года — это было задание № 22 ЕГЭ

    Плейлист видеоразборов задания на YouTube:
    Задание демонстрационного варианта 2022 года ФИПИ


    23_4: Разбор досрочного ЕГЭ по информатике 2019:

    Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:

    1. Прибавить 1
    2. Умножить на 2

    Сколько существует программ, для которых при исходном числе 3 результатом является число 37 и при этом траектория вычислений содержит число 18?

    Ответ: 28

    Показать решение:

    📹 Видео

    📹 Видеорешение на RuTube здесь



    23_2:

    У исполнителя Увеличитель две команды, которым присвоены номера:

    1. прибавь 1
    2. умножь на 4

    Первая из них увеличивает число на экране на 1, вторая умножает его на 4.

    Программа для Увеличителя – это последовательность команд.

    Сколько есть программ, которые число 3 преобразуют в число 44?

    Ответ: 10

    Показать решение:

    Использование графов

    • Возьмем такое наименьшее число, находящееся в интервале от 3 до 44, для которого применима только одна команда:
    • 12 
      к нему применима только команда - прибавь 1 
      12 * 4 = 48 - это больше, чем 44 
      
    • Отобразим число 12 на графе, указав и саму команду и результат. То есть для 12 можно использовать только одну команду (12 + 1 = 13):
    • 1
      Пояснение: Красным цветом будем выделять количество команд для получения конкретного числа, а в круг обводить итоговое суммарное количество команд.

    • Дальше будем использовать метод решения с конца, т.е. двигаясь от наибольших подходящих чисел (в конкретном случае с 12) — к наименьшим.
    • разбор 33 задания егэ
      Пояснение: поскольку это задача динамического программирования, то полученные промежуточные результаты, используются для дальнейших вычислений:

      • для 11 взят результат, полученный для 12 (1);
      • для 10 взят результат, полученный для числа 11 (2);
      • для 9 взят результат, полученный для 10 (3);
      • и т.д.
    • Для последнего числа 3 получено 10 команд.

    📹 Видео (теоретическое решение)

    📹 Видеорешение на RuTube здесь (теоретический способ)


    23_3. Демоверсия ЕГЭ 2018 информатика:

    Исполнитель М17 преобразует число, записанное на экране.
    У исполнителя есть три команды, которым присвоены номера:
     1. Прибавить 1
     2. Прибавить 2
     3. Умножить на 3

    Первая из них увеличивает число на экране на 1, вторая увеличивает его на 2, третья умножает на 3. Программа для исполнителя М17 – это последовательность команд.

    Сколько существует таких программ, которые преобразуют исходное число 2 в число 12 и при этом траектория вычислений программы содержит числа 8 и 10? Траектория должна содержать оба указанных числа.

    Траектория вычислений программы – это последовательность результатов выполнения всех команд программы. Например, для программы 132 при исходном числе 7 траектория будет состоять из чисел 8, 24, 26.

    Ответ: 60

    Показать решение:

    • Изобразим траекторию в виде луча, на котором отложим отрезки:
    • поиск траектории

    • Поскольку 8 и 10 обязательно должны содержаться в расчете, то для поиска общего количества программ необходимо найти произведение количества программ отдельных отрезков:
    • 1 * 2 * 3
      или
      (2 -> 8) * (8 -> 10) * (10 -> 12)
      
    • Найдем отдельно количество программ каждого из отрезков:
    • 2 -> 8 = 15
    • На интервале от 2 до 8 возьмем наименьшее число, для которого исполнима только одна из команд:
    • 7
      7 + 1 = 8
      7 + 2 = 9 - нельзя, вне интервала
      
    • Рассмотрим все числа интервала, двигаясь от большего к меньшему:
    • траектория

    • 8 -> 10 = 2
    • очевидно, что это две программы:
    • 2

    • 10 -> 12 = 2
    • 1

    • Выполним произведение полученных результатов:
    • 15 * 2 * 2 = 60
      

    📹 Видео (теоретическое решение)

    📹 Видеорешение на RuTube здесь


    Информатика ЕГЭ 22 задание разбор

    22-е задание: «Программирование: циклы и ветвления»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 7 минут.
      
    Проверяемые элементы содержания: Умение анализировать алгоритм, содержащий ветвление и цикл
    До ЕГЭ 2021 года — это было задание № 20 ЕГЭ

    Плейлист видеоразборов задания на YouTube:
    Задание демонстрационного варианта 2022 года ФИПИ


    Задания на работу с цифрами чисел в различных системах счисления

    22_1:

    Ниже записан алгоритм.
    Получив на вход число x, этот алгоритм печатает число L.
      
    Укажите наибольшее нечетное число x, при вводе которого алгоритм печатает 53.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var x, L, M, D: integer;
    begin
      readln(x);
      D:=x;
      L:=23;
      M:=141;
      while L<=M do
      begin
        L:=L+D;
        M:=M-3*D;
      end;
      writeln(L);
    end.

    Подобные задания для тренировки

    Ответ: 15

    Показать решение:

    ✎ Решение с использованием программирования:
    Pascal:

    var
      x, L, M, D: longint;
     
    begin
      x := 1000;
      while true do
      begin
        D := x;
        L := 23;
        M := 141;
        while L <= M do
        begin
          L := L + D;
          M := M - 3 * D;
        end;
        if (l = 53) and (x mod 2 <> 0) then 
        begin
          print(x); break;
        end;
        x -= 1;
      end;
    end.

    ✎ Аналитическое решение:
    Разберем решение по одному из возможных вариантов выполнения данного задания.
    Рассмотрим алгоритм:

    • Результатом программы является вывод L.
    • Цикл перестанет работать, когда L станет больше M (т.к. while L<=M).
    • D в программе - это и есть искомый x (D:=x;).
    • В цикле оператор L:=L+D работает, как сумматор: L накапливает в себе сумму всех D, тогда как D в нашей задаче не меняется и равна введенному x.
    • Сумматор (L) до цикла обычно обнуляется, сделаем это: т.е. в строке 5 вместо L:=23 представим, что L:=0. Тогда и условие задачи поменяется: т.е. вместо указанного в условии числа 53 программа выводит L равное 53-23 = 30. А в условии цикла M также изменит свое значение на 141-23=118:
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      ...
        L:=23;
        M:=141;
        while L<=M do // L<=118 для первой итерации
        begin
          L:=L+D;
          M:=M-3*D;
        end;
        writeln(L); // выводится L = 30
      end.
    • Так как по заданию необходимо найти наибольший x, то представим, что он равен как раз 30:
    • L = L + D => L = 0 + 30 => L = 30 
      
    • Но число 30 - четное, а по условие необходимо нечетное x.
    • Значит, одного прохождения цикла недостаточно.
    • Предположим, что цикл имеет две итерации. За два прохождения цикла L увеличится на 2*D, то есть нужно взять такое D, чтобы 2*D было равно 30:
    • 30 / 2 = 15 
      То есть D = x = 15
      
    • Проверим:
    • D=15         1 проход       2 проход      
      L:=L+D:       0+15=15        15+15=30       
      M:=M-3*D:   118-3*15=73    73-3*15 = 28   
      L<=M:        да: 15<=73    нет: 30 > 28
      
    • Т.е. D=15 полностью подходит, и это наибольшее возможное число при данных условиях.

    📹 Видео (теоретическое решение)

    📹 Видеорешение на RuTube здесь


    22_9:

    Ниже записан алгоритм.
    Получив на вход число x, этот алгоритм печатает число L.
      
    Укажите наибольшее нечетное число x, при вводе которого алгоритм печатает 125.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var x, L, M, D: integer;
    begin
      readln(x);
      D:=x;
      L:=17;
      M:=70;
      while L<=M do
      begin
        L:=L+2*D;
        M:=M+D;
      end;
      writeln(L);
    end.

    Ответ: 27

    Показать решение:

    📹 Видео

    📹 Видеорешение на RuTube здесь


    22_2:

    Ниже записан алгоритм. Получив на вход число x, этот алгоритм печатает S. Известно, что 100 ≤ x ≤ 200.
      
    Укажите наибольшее допустимое число x, при вводе которого алгоритм распечатает 30.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    var x,A,B,D,S: integer;
    begin
      readln(x);
      B:= x;
      A:= 9;
      D:= x;
      S:= 0;
      while (D div 2)>0 do
      begin
        if (D mod 2) = 1 then
          S:= S + 1
        else
          S:= S + A;
        D:= D div 2;
      end;
      writeln(S);
    end.

    Подобные задания для тренировки

    Ответ: 120

    Показать решение:

    ✎ 1 способ (аналитический):
     

      Для начала рассмотрим алгоритм программы:

    1. В начале программы вводится x, две переменные - B и D присваивают значение введенного x. Переменной A присваивается значение 9, а переменная S обнуляется.
    2. Далее следует цикл, который зависит от переменной D (равной x): пока x div 2 > 0 выполняется тело цикла. Т.е. пока x, деленный целочисленно на 2, больше нуля.
    3. В теле цикла происходит увеличение переменной S либо на 9 (А:=9), либо на 1 в зависимости от четности значения D. Т.е. переменная S увеличивается на 9 в случае, если очередное значение D - четное и увеличивается на 1, если очередное значение D - нечетное.
    4. В конце цикла D целочисленно делится на 2 (D := D div 2).
    5. По условию программы S должно быть равно 30. Посчитаем максимальное количество итераций цикла: 2n <= 200, т.е. n = 7 (максимальное значение D - 200 - делим целочисленно на 2, пока это возможно). При этом минимальное количество итераций - 6 (2n >=100, т.е. n = 6)
    6. За 7 или 6 итераций цикла необходимо получить S = 30, каждую итерацию цикла, увеличивая S либо на 1, либо на 9. Рассмотрим варианты:
    7. 30 = 9 + 9 + 9 + 1 + 1 + 1  ->  (получаем 6 итераций, что соответствует действительности)
      30 =  9 + 9 + 12 * 1 (если взять две девятки, то цикл должен работать 14 раз 
      (9 + 9 + [12 единиц]), а это невозможно)
      
    8. Из 6 итераций имеем: 3 итерации с D - нечетным (когда s = s + 1) и 3 итерации с D - четным (когда s = s + 9)
    9. Четность чисел в двоичной системе счисления зависит от младшего бита: если младший бит = 0, то число четное, если 1, то число нечетное. Поскольку нам необходимо найти наибольшее x, то необходимо в трех старших битах данного числа, выраженного в двоичной системе счисления, поместить 1, а в остальных трех битах разместить 0. При этом необходимо не забыть про еще один старший бит равный 1 (в итерациях его нет, т.к. это последняя единица, которая уже не удовлетворяет условию цикла: условие цикла ложно while (1 div 2) > 0 - ложь):
    10. 11110002 = 12010
      первая единица будет стоять всегда, она не участвует в итерациях цикла
      
      Проверка:
      120| 0  - соответствует s + 9
       60| 0  - соответствует s + 9
       30| 0  - соответствует s + 9
       15| 1  - соответствует s + 1
        7| 1  - соответствует s + 1
        3| 1  - соответствует s + 1
        1|
       

    ✎ 2 способ:

      Рассмотрим алгоритм:

    • Значение искомого x присваивается сразу двум переменным B и D, но B более нигде не используется, поэтому забудем про нее. D - это x.
    • В цикле:

    • D mod 2 - это крайняя справа цифра числа в двоичной системе счисления (младший разряд); т.е.:
    • например, если D = 510 = 1012, то D mod 2 = 1 (101)
    • в цикле есть сумматор S, результат которого выводится в программе (результат 30), и который накапливает в себя значения по следующему принципу:
    • если указанная крайняя цифра = 1, то в S добавляется 1, если крайняя цифра = 0, то в S добавляется 9 (А = 9);
    • последнее действие цикла D:= D div 2 - это отсечение крайнего младшего разряда числа D в двоичной системе счисления, т.е.:
    • если было D = 510 = 1012, то стало D = 102
    • условие цикла: пока D при целочисленном делении на 2 больше 0 (while (D div 2)>0);
    • анализ алгоритма показывает, что вводимый x можно рассматривать в двоичной системе счисления. Поскольку сумматор S выводит в результате число 30, то можно понять, как накапливается это число в S:
    • 30 = 9 + 9 + 9 + 1 + 1 + 1  ->  (получаем 6 итераций цикла)
    • поскольку цифра 9 прибавлялась 3 раза и единица прибавлялась 3 раза, значит, в двоичной записи исходного числа D было 3 цифры 0 и три цифры 1. Чтобы получить наибольшее x, как указано в задании, расположим в старших битах единицы, а в младших 0:
    • 111000
    • важно не забыть крайнюю слева цифру 1, которая останется не учтенной в цикле, так как условие при последней единице не выполняется:
    • при оставшемся D = 1 условие while (1 div 2) > 0 не работает, 
      поэтому добавляем еще старший разряд "1"
      таким образом, получаем число в двоичной системе: 1111000 
      
    • переведем в десятичное представление:
    • 64 32 16  8  4  2  1
      1  1   1  1  0  0  0   = 64 + 32 + 16 + 8 = 12010

    📹 Видео 1 (долгий способ)
    📹 Видеорешение на RuTube здесь

    📹 Видео 2
    📹 Видеорешение на RuTube здесь


    22_3:

    Ниже записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M.
      
    Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 2, а потом 8.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var x,L,M: integer;
    begin
      readln(x);
      L:=0; M:=0;
      while x>0 do
      begin
        L:=L + 1;
        if M < (x mod 10) then
          M:=x mod 10;
        x:=x div 10;
      end;
      writeln(L);writeln(M);
    end.

    Подобные задания для тренировки

    Ответ: 88

    Показать решение:

    Рассмотрим алгоритм работы с L:

    • В конце программы алгоритм выводит значение L, равное 2 (по условию). В цикле L - это счетчик, увеличивающийся каждую итерацию цикла (каждое прохождение цикла) на 1.
    • Таким образом, цикл работает два раза.
    • В цикле x постоянно уменьшается на 1 разряд, т.е. от него отсекается цифра справа (x:=x div 10):
    • например, x = 243
      после выполнения x:=x div 10 получаем
      х = 24
      
    • Так как цикл работает два раза, значит x - двухзначное число, т.е. после двух проходов (итераций) цикла условие цикла перестало работать (x стало <= 0).

    Рассмотрим работу с M в цикле:

    • В первую итерацию цикла М всегда заменится на значение x mod 10, так как изначально М = 0.
    • Из предыдущего пункта имеем, что M - это наименьшая цифра числа:
    • например, x = 243
      после выполнения M := x mod 10; получаем
      1 шаг: М = 3
      2 шаг: М = 3
      3 шаг: М = 2 
      
    • В результате работы программы на экран выводится М = 8.

    Рассмотрим две цифры числа x путем подстановки:

    • Поскольку по условию нам нужно наибольшее x, то попробуем в единицы записать число 8:
    • ? 9
    • В таком случае во второй итерации цикла условие в цикле M < (x mod 10) не будет работать, и программа распечатает 9 (вместо 8). Т.е. 9 не походит:
    • if M  < (x mod 10) then
            M:=x mod 10;
      1 шаг: 
      if 0  < (9) then
            M:=9;
      2 шаг:
      if 9 < (любая цифра) then ... 
      Условие не работает, программа распечатает М = 9. Не подходит!
      
    • Поставим вместо разряда единиц число 8:
    • ? 8
    • После первой итерации цикла M = 8 (по условию нам подходит):
    • if M  < (x mod 10) then
            M:=x mod 10;
      1 шаг: 
      if 0  < (8) then
            M:=8;
      
    • Теперь рассмотрим первую цифру числа x:
    • 9 8
      если она равна 9 (то есть число 98), 
      то М станет = 9 (а нам необходимо, чтобы осталось 8):
      
      1 шаг: 
      if 0  < (8) then
            M:=8;
      2 шаг:
      if 8 < 9 then ... 
      Условие работает, программа распечатает М = 9. Не подходит!
      
    • Возьмем цифру 8 (88):
    • 8 8
      1 шаг: 
      if 0  < (8) then
            M:=8;
      2 шаг:
      if 8 < 8 then ... 
      Условие не работает, программа распечатает М = 8. Подходит!
      
    • Наибольшее х = 88.

    📹 Видео

    📹 Видеорешение на RuTube здесь


    22_5. Демоверсия ЕГЭ 2018 информатика:

    Ниже записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа: L и M.
      
    Укажите наименьшее число x, при вводе которого алгоритм печатает сначала 5, а потом 7.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    var x, L, M: integer;
    begin
    readln(x);
    L := 0;
    M := 0;
    while x > 0 do
    begin
      M := M + 1;
      if x mod 2 <> 0 then
         L := L + 1;
      x := x div 2;
    end;
    writeln(L);
    writeln(M);
    end.

      
    Типовые задания для тренировки

    Ответ: 79

    Показать решение:

    ✎ Способ 1:

      Рассмотрим алгоритм:

      В цикле:

    • Наличие операторов x mod 2 и x div 2 говорит о том, что эту задачу можно решать, представляя x в двоичной системе счисления.
    • В цикле есть счетчик M, который увеличивается на единицу и в конце программы будет соответствовать количеству итераций цикла. Таким образом, имеем 7 проходов цикла.
    • Условие if x mod 2 <> 0 проверяет на нечетность младший разряд числа в двоичной системе:
    • например, если было x = 510 = 1012, 
      то if x mod 2 <> 0 проверяет if 1 <> 0
      
    • Если в младшем разряде стоит единица (в двоичной системе число состоит только из 1 и 0), то срабатывает счетчик L, который увеличивается на единицу.
    • В строке x := x div 2; отсекается младший разряд двоичного представления значения x, т.е.:
    • если было, например, x = 510 = 1012, то стало x = 102
      
    • Таким образом, счетчик L подсчитывает количество единиц в двоичной записи числа. Так как в результате выводится L = 5, то в двоичной записи числа 5 единиц.
    • Так как цикл работает 7 раз, и в каждой итерации от числа в двоичной записи отсекается один разряд, то имеем 7 разрядов (цифр) в числе.
    • Итого, в двоичной записи 5 единиц и 2 нуля. Для получения наименьшего x (по заданию) расположим цифры следующим образом:
    • 10011112 = 64 + 8 + 4 + 2 + 1 = 7910
      

      
    ✎ Способ 2 (длительный, аналитический):
     

      Для начала рассмотрим алгоритм программы:

    • В начале программы вводится x, и обнуляются две переменные - L и M.
    • Далее следует цикл, который зависит от переменной x: пока x > 0 выполняется тело цикла.
    • В теле цикла каждый его шаг происходит увеличение переменной M на единицу. Т.е. переменная M - это счетчик, соответственно, его значение по завершению работы цикла будет соответствовать количеству шагов (итераций) цикла.
    • В конце программы печатается сначала L, потом M. Т.е. L должно быть равно 5, а M = 7. Раз M будет равно 7, то из предыдущего пункта видим, что цикл имеет 7 шагов, т.е. 7 итераций.
    • L - это тоже счетчик, но из условия if x mod 2 <> 0 видим, что счетчик L подсчитывает количество нечетных промежуточных x. Т.е. x в цикле постоянно меняется, а L проверяет x и в случае нечетного значения увеличивается на единицу. В программе L должно стать 5.
    • В цикле x делится целочисленно на 2: x := x div 2
    • Поскольку цикл завершит работу, когда x = 0, то последним шагом будет x = 1 div 2 = 0. Т.е. в предпоследнем шаге x = 1.
    • Решим данную задачу с конца, проследив все итерации цикла. Получается, что из предыдущего шага в следующий шаг x изменяется по двум правилам, назовем их командами:
    • 1. x*2 -> если предыдущий x - четный, 
      например 4 div 2 - обратное действие 2*2 = 4
      
      2. x*2+1 -> если предыдущий x - нечетный, 
      например 5 div 2 - обратное действие 2*2+1 = 5
      
    • Так как L в результате равно 5, значит, в программе 5 команд № 2 и 2 команды №1 (7-5 = 2)
    • Нарисуем дерево команд и получающиеся значения, начиная с последней итерации цикла до начальной итерации. Т.е. начнем с завершения цикла, когда x стал = 0:
    • 18 задание егэ информатика демоверсия 2018 решение

    • Вниз уходят команды, дающие четные значения x, а вверх - нечетные. Поскольку нам необходимо найти наименьший x, то "выгоднее" проследить нижние ветви дерева, т.к. они в результате дают меньшие значения.
    • Из дерева видим, что первая команда - это команда 2. В итоге осталось 4 команды № 2 и 2 команды № 1.
    • Нам выгодно с самого начала "двигаться" по дереву, используя команды №1 (чтобы x был наименьшим). Поэтому вторая и третья ветвь будут соответствовать команде №1. Поскольку первых команд должно быть только две, остальные команды будут №2.
    • Итого получаем следующий путь по дереву, в результате которого x становится равным 79.

    📹 Видео 1(быстрый способ)

    📹 Видеорешение на RuTube здесь

    📹 Видео 2 (аналитическое решение)

    📹 Видеорешение на RuTube здесь


    22_6: Досрочный егэ по информатике 2018, вариант 1:

    Укажите наибольшее десятичное число, при вводе которого на экране сначала напечатается 3, а затем 6.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    var x, L, M: integer;
    begin
     readln(x);
     L:=0; M:=0;
     while x > 0 do begin
      L:=L + 1;
      if (x mod 2) <> 0 then
        M:= M + x mod 8;
      x:= x div 8;
     end;
     writeln(L); write(M);
    end.

      
    Типовые задания для тренировки

    Ответ: 425

    Показать решение:

    Результат: 425

    📹 Видео

    📹 Видеорешение на RuTube здесь


    22_7:

    Получив на вход натуральное десятичное число х, этот алгоритм печатает два числа: L и М.
    Укажите наименьшее число х, при вводе которого алгоритм печатает сначала 42, а потом 4.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    var
      x, L, M: integer;
    begin
      readln(x);
      L := 1;
      M := 0;
      while x > 0 do
      begin
        M := M + 1;
        if x mod 8 > 3 then
          L := L * (x mod 8);
        x := x div 8
      end;
      writeln(L);
      writeln(M)
    end.

    Ответ: 567

    Показать решение:

      Рассмотрим алгоритм:

    • В конце программы на экран выdодится сначала значение переменной L, затем M. Т.е. согласно заданию, получается что:
    • в конце программы: 
      L = 42   M = 4
      
    • В цикле while две операции указывают на то, что данное задание проще рассматривать при работе с числом в 8-й системе счисления:
    • 1. x mod 8 - младший разряд числа в 8-й системе счисления 
      т.е., например: 568
      тогда  x mod 8 - это цифра 6
      
      2. x := x div 8 - "отсекание" младшего разряда числа в 8-й системе счисления
      т.е., например: x = 4610 = 568
      тогда  x := x div 8 -> x = 510 = 58
       
    • Таким образом, в цикле рассматриваются цифры числа в 8-й системе счисления. В конце цикла, каждый раз от числа "отсекается" крайний разряд, тем самым число теряет цифру. Цикл выполняется до тех пор, пока есть цифры в числе (while x > 0).
    • М - это счетчик итераций, т.е. шагов цикла, т.к. М увеличивается каждый раз на единицу. Поскольку количество цифр числа уменьшается с каждой итерацией, то М в результате возвращает количество цифр числа - по заданию М = 4. Значит, число x - четырехзначное.
    • В условии if x mod 8 > 3 then проверяется каждая цифра числа: если она больше трех, то выполняется действие L := L * (x mod 8);. Дословно, это говорит о том, что L - это произведение цифр числа (в его 8-м представлении), которые больше трех.
    • Таким образом соберем все выводы:
    • М = 4 - количество цифр числа т.е.
      x в 8-й системе счисления имеет 4 разряда: ? ? ? ?
      L = 42 произведение цифр, которые больше трех.
      
    • По заданию нам необходимо найти наименьшее x. Теперь, зная, что х - четырехзначное, а 42 - произведение его цифр, больших трех, найдем, как получается 42:
    • 42 = 6 * 7 
      
    • Соответственно, для старшего разряда поставим единицу, а один разряд оставим равным 0:
    • x = 10678
    • Осталось перевести получившееся число в 10-ю систему счисления, чтобы найти исходный x:
    • 10678 = 56710

    Результат: 567


    22_8:

    Укажите количество двузначных натуральных чисел, при вводе которых приведенная ниже программа напечатает число 0.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    var
      i, n: longint;
    begin
      i := 0;
      readln(n);
      while (n > 0) do
      begin
        i := i + n mod 8;
        n := n div 8;
      end;
      writeln(i mod 7);
    end.

    Ответ: 13

    Показать решение:

      Один из вариантов решения:

    • В цикле while две операции указывают на то, что данное задание можно рассматривать при работе с числом в 8-й системе счисления:
    • 1. n mod 8 - младший разряд числа в 8-й системе счисления 
      т.е., например: 568
      тогда  n mod 8 - это цифра 6
      
      2. n := n div 8 - "отсекание" младшего разряда числа в 8-й системе счисления
      т.е., например: n = 4610 = 568
      тогда  n := n div 8 -> n = 510 = 58
       
    • Таким образом, в цикле рассматриваются цифры числа в 8-й системе счисления. В конце цикла, каждый раз от числа "отсекается" крайний разряд, тем самым число теряет цифру. Цикл выполняется до тех пор, пока есть цифры в числе (while n > 0).
    • i - это сумматор, который аккумулирует (суммирует) цифры восьмеричного числа: поскольку n mod 8 - младшая цифра числа, и каждую итерацию цикла от числа отсекается цифра младшего разряда, то на каждом шаге в i добавляется очередная справа цифра числа:
    • Например:  n = 2568
      1) i := i + n mod 8; => i = 0 + 6 = 6  (256)
      2) i := i + n mod 8; => i = 6 + 5 = 11  (256)
      3) i := i + n mod 8; => i = 11 + 2  = 13 (256)
      
    • В конце программы распечатывается значение i mod 7, т.е. остаток от деления получившейся суммы на число 7.
    • Таким образом соберем все выводы:
    • i - сумматор цифр введенного числа n в его восьмеричном представлении
      n - двузначные десятичные числа (по условию)
      результат программы = i mod 7 = 0, т.е. остаток от деления итоговой суммы на 7 (= 0)
      
    • Поскольку в условии говорится о десятичных числах, т.е. вводятся двузначные десятичные числа. Рассмотрим максимальное и минимальное двухзначное десятичное число, преобразованное в 8-ю систему счисления:
    • nmin = 1010 = 128
      nmax = 9910 = 1438
       
    • Выберем суммы цифр чисел в диапазоне от 12 до 143 (исключая цифры большие 7, т.к. 8-я с.с):
    • 16 = 1+6 = 7 (7 mod 7 = 0), 
      25 = 2+5 = 7 (7 mod 7 = 0), 
      34 = 3+4 = 7 (7 mod 7 = 0), 
      43 = 4+3 = 7 (7 mod 7 = 0), 
      52 = 5+2 = 7 (7 mod 7 = 0), 
      61 = 6+1 = 7 (7 mod 7 = 0), 
      70 = 7+0 = 7 (7 mod 7 = 0), 
      77 = 7+7 = 14 (14 mod 7 = 0), 
      106 = 1+6 = 7 (7 mod 7 = 0), 
      115 = 1+1+5 = 7 (7 mod 7 = 0), 
      124 = 1+2+4 = 7 (7 mod 7 = 0), 
      133 = 1+3+3 = 7 (7 mod 7 = 0), 
      142 = 1+4+2 = 7 (7 mod 7 = 0),
      
    • Посчитаем количество таких чисел - их 13.

    22_10:

    Получив на вход натуральное число x, этот алгоритм печатает два числа: a и b. Укажите наименьшее натуральное число, при вводе которого алгоритм печатает сначала 1, а потом 9.
    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var x, a, b: longint;
    begin
    readln(x);
    a := 0; b := 1;
    while x > 0 do begin
      if x mod 2 = 0 then
         a := a + x mod 9
      else
         b := b * (x mod 9);
      x := x div 9;
    end;
    writeln(a); write(b);
    end.
    Бейсик:

    INPUT x
    a=0: b=1
    WHILE x>0  
        IF x MOD 2 = 0 THEN
          a = a + x MOD 9
        ELSE
          b = b * x MOD 9
        END IF
        x = x \ 9
    WEND
    PRINT a
    PRINT b
    END
    Python:

    x = int(input())
    a = 0
    b = 1
    while x > 0:
        if x % 2 == 0:
            a = a + x % 9
        else:
            b = b * (x % 9)
        x = x // 9
    print(a)
    print(b)
    С++:

    #include <iostream>
    using namespace std;
    int main()
      {
      int x, a, b;
      cin >> x;
      a = 0; b = 1;
      while (x > 0) {
        if (x%2 == 0) a += x%9;
        else b *= x%9;
        x = x / 9;
        }
      cout << a << endl << b;
      return 0;
    }

    Ответ: 255

    Показать решение:

      Рассмотрим алгоритм.

    • Программа получает на вход число x.
    • В цикле, пока число x больше 0, в зависимости от того, четное ли число x выполняются действия:
    • если четное, то в переменную a добавляется остаток от деления числа x на 9;
    • if x mod 2 = 0 then
        a := a + x mod 9
    • если нечетное, то переменная b умножается на остаток от деления числа x на 9;
    • else
        b := b * (x mod 9);
    • x целочисленно делится на 9.
    • x := x div 9;
    • Эти три действия в цикле - ни что иное, как работа с цифрами числа в 9-й системе счисления. Тогда, проверим значение x на четность в 9-й с.с.:
    • если четное, то в переменную a добавляется крайняя справа цифра числа (остаток от деления числа x на 9);
    • если нечетное, то переменная b умножается на крайнюю справа цифру числа x;
    • x целочисленно делится на 9: значит, отсекаем от x в 9-й с.с. крайнюю справа цифру.
    • Теперь попробуем подобрать наименьшее число x, рассматривая его пока в 9-й с.с.
    • Вспомним, что для систем счисления с нечётным основанием (наш случай, 9 - нечетное) справедливо утверждение, что число чётно тогда и только тогда, когда сумма всех его цифр чётна.

      произведение цифр (b) должно быть равно 9 (если число x нечетное)
      сумма цифр (a) должна быть равна 1 (если число x четное)

      однозначное число:
      минимальное 9, но цифры 9 в 9-й с.с. нет.
      других вариантов получить 9 нет
      
      двухзначное число:
      минимальное 33
      3 + 3 = 6 (четное) => a = 0 + 3 = 3, не подходит (т.к. а=1)
      других вариантов получить 9 нет
      
      трехзначное число:
      1 случай:
      минимальное 133
      1 + 3 + 3 = 7 (нечетное) => b = 1 * 3 = 3
      отсекаем: x = 13
      1 + 3 = 4 (четное) => a = 0 + 3 = 3, не подходит (т.к. а=1)
      
      2 случай:
      следующее минимальное 313
      3 + 1 + 3 = 7 (нечетное) => b = 1 * 3 = 3
      отсекаем: x = 31
      3 + 1 = 4 (четное) => a = 0 + 1 = 1
      отсекаем: x = 3
      3 (нечетное) => b = 3 * 3 = 9
      отсекаем: x = 0, конец цикла
      
    • Результаты нас устраивают (a = 1, b = 9). Переведем число 313 из 9-й с.с. в 10-ю:
    • 3139 = 3 * 92 + 1 * 9 + 3 = 25510

    📹 Видео

    📹 Видеорешение на RuTube здесь


    Задания на алгоритм Евклида и поиск НОД

    22_4:

    Ниже записан алгоритм. Получив на вход число x, этот алгоритм печатает число M.
      
    Известно, что x>40. Укажите наименьшее такое (т.е. большее 40) число x, при вводе которого алгоритм печатает 5.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    var x,L,M: integer;
    begin
      readln(x);
      L:=x; 
      M:=5;
      if L mod 2 = 0 then
        M:=24;
      while L <> M do
        if L > M then
          L:=L-M
        else
          M:=M-L;
      writeln(M);
    end.

    Ответ: 45

    Показать решение:

    Рассмотрим алгоритм:

    • В начале программы запрашивается x. Переменной L присваивается значение x, а переменной M - значение 5.
    • Затем в условии проверяется четность переменной L: если переменная четная, то M присваивается значение 24.
    • Далее следует цикл, зависящий от переменных L и M: цикл завершится, когда L сравняется с M, т.е. согласно условию, когда L = M = 5 (так как по завершению программы на экран выводится число 5):
    • По завершению программы:
      L = M = 5
      
    • Кроме того, по условию известно, что x > 40.
    • В цикле из переменной большего значения вычитается переменная меньшего значения (алгоритм Евклида поиска наибольшего общего делимого):
    • НОД (a, b) = если a > b, то НОД (a-b, b) = если b > a, то НОД (a, b-a)
      
    • Поскольку в результате работы программы распечатывается значение M, равное 5, то можно утверждать, что если условие if L mod 2 = 0 не будет истинным, то в цикле постоянно будет происходить действие L:=L-M). Т.е. постоянно вычитается 5.
    • Исходя из предыдущего пункта, исходное число x должно быть кратно 5, так как в результате печатается 5 (M). А при M=24 алгоритм не выдаст в результате значение 5.
    • Первое наименьшее число, кратное 5 и большее 40 (по условию) - это 45.
    • Проверим по алгоритму:
    • L  M
      
      45 5
      40 5
      35 5
      30 5
      25 5
      20 5
      15 5
      10 5
      5  5 
      
    • Если следовать алгоритму Евклида, то число 5 (результат) - это наибольший общий делитель числа 5 (исходное значение M) и числа x (введенного числа). Поскольку x больше 40, то наименьшим значением для которого общим делителем с числом 5 будет само число 5 - это число 45.

    📹 Видео

    📹 Видеорешение на RuTube здесь


    Информатика ЕГЭ 15 задание разбор

    15 задание ЕГЭ «Основные законы алгебры логики»

    15-е задание: «Основные законы алгебры логики»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 5 минут.
      
    Проверяемые элементы содержания: Знание основных понятий и законов математической логики
    До ЕГЭ 2021 года — это было задание № 18 ЕГЭ

    Плейлист видеоразборов задания на YouTube:

    Задание демонстрационного варианта 2022 года ФИПИ


    Задания с множествами

    15_16:

    Элементами множества А являются натуральные числа. Известно, что выражение

    ((x ∈ {1, 3, 5, 7, 9, 11}) → ¬(x ∈ {3, 6, 9, 12})) ∨ (x ∈ A)

    истинно (т. е. принимает значение 1) при любом значении переменной х.

    Определите наименьшее возможное значение суммы элементов множества A.

    Ответ: 12

    Показать решение:

    • Введем обозначения:
    • P ≡ (x ∈ {1, 3, 5, 7, 9, 11}) ; 
      Q ≡ (x ∈ {3, 6, 9, 12}) ; 
      A ≡ (x ∈ A).
      
    • Выполним преобразования:
    • (P → ¬Q) ∨ A = 1
      Избавимся от импликации:
      ¬P ∨ ¬Q ∨ A = 1
      
    • Разделим выражение на две части — известную часть и неизвестную. Чтобы неизвестная часть (А) была непременно истинной, необходимо, чтобы известная часть была ложна:
    • ¬P ∨ ¬QА = 1
          0      1
      
    • То есть получаем:
    • ¬P ∨ ¬Q = 0,
      или 
      ¬P = 0  отсюда P = 1
      ¬Q = 0 отсюда Q = 1
    • Таким образом имеем пересечение (умножение) двух множеств Q и P. То есть необходимо выбрать элементы, которые встречаются в обоих множествах одновременно:
    • A = {3,9}
      
    • Сумма элементов:
    • 3 + 9 = 12

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    15_17:

    Элементами множества А являются натуральные числа. Известно, что выражение

    (x ∈ {2, 4, 6, 8, 10, 12}) → (((x ∈ {3, 6, 9, 12, 15}) ∧ ¬(x ∈ A)) → 
    → ¬(x ∈ {2, 4, 6, 8, 10, 12}))

    истинно (т. е. принимает значение 1) при любом значении переменной х.

    Определите наименьшее возможное значение суммы элементов множества A.

    Типовые задания для тренировки

    Ответ: 18

    Показать решение:

    • Введем обозначения:
    • P≡(x ∈ {2, 4, 6, 8, 10, 12}) ; 
      Q ≡ (x ∈ {3, 6, 9, 12, 15}) ; 
      A ≡ (x ∈ A).
      
    • Выполним преобразования:
    • P → ((Q ∧ ¬A)  ¬P) = 
      P  (¬(Q ∧ ¬А)  ¬P) = 
      ¬P  (¬(Q ∧ ¬А) ∨ ¬P) = 
      ¬P  ¬Q ∨ А.
      
    • Разделим выражение на две части — известную часть и неизвестную. Чтобы неизвестная часть (А) была непременно истинной, необходимо, чтобы известная часть была ложна:
    • ¬P ∨ ¬QА = 1
          0      1
      
    • То есть получаем:
    • ¬P ∨ ¬Q = 0,
      или 
      ¬P = 0  отсюда P = 1
      ¬Q = 0 отсюда Q = 1
    • Таким образом имеем пересечение (умножение) двух множеств Q и P. То есть необходимо выбрать элементы, которые встречаются в обоих множествах одновременно:
    • A = {6,12}
      
    • Сумма элементов:
    • 6 + 12 = 18
    15_18:

    Элементами множеств А, P, Q являются натуральные числа, причём P = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}, Q = {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}. Известно, что выражение

    ( (x ∈ A) → (x ∈ P) ) ∧ ( (x ∈ Q) → ¬(x ∈ A) )

    истинно (т. е. принимает значение 1) при любом значении переменной х.

    Определите наибольшее возможное количество элементов в множестве A.

    Типовые задания для тренировки

    Ответ: 7

    Показать решение:

    • Введем обозначения:
    • P ≡ (x ∈ P); 
      Q ≡ (x ∈ Q); 
      A ≡ (x ∈ A).
      
    • Выполним преобразования:
    • Избавимся от импликации:
      (¬A ∨ P) ∧ (¬Q ∨ ¬A) = 1
      Применим распределительный закон (но можно вывести самостоятельно):
      ¬A ∨ (P ∧ ¬Q) = 1
      
    • Разделим выражение на две части — известную часть и неизвестную. Чтобы неизвестная часть (А) была непременно истинной, необходимо, чтобы известная часть была ложна:
    • ¬A(P ∧ ¬Q) = 1
       0      1
      
    • То есть получаем:
    • P ∧ ¬Q = 1,
      или 
      P = 1  и
      ¬Q = 1 отсюда Q = 0
    • Таким образом имеем разность двух множеств Q и P. То есть это новое множество, элементы которого принадлежат P, но не принадлежат Q:
    • A = {2, 4, 8, 10, 14, 16, 20}
      
    • Количество элементов = 7
    15_20: Закон поглощения

    Элементами множества А являются натуральные числа. Известно, что выражение

    ¬(x ∈ A) →¬(x ∈ {1, 3, 7}) ∨ (¬(x  ∈ {1, 2, 4, 5, 6}) ∧ (x ∈ {1, 3, 7})) 
    

    истинно (т. е. принимает значение 1) при любом значении переменной х.

    Определите наименьшее возможное количество элементов множества A.

    Ответ: 1

    Показать решение:

    • Введем обозначения:
    • P ≡ (x ∈ {1, 3, 7}); 
      Q ≡ (x  ∈ {1, 2, 4, 5, 6}); 
      A ≡ (x ∈ A).
      
    • Выполним преобразования:
    • Избавимся от импликации:
      A ∨ ¬P ∨ (¬Q ∧ P) = 1
      Применим закон поглощения (но можно вывести самостоятельно):
      A ∨ ¬P ∨ ¬Q = 1
      
    • Разделим выражение на две части — известную часть и неизвестную. Чтобы неизвестная часть (А) была непременно истинной, необходимо, чтобы известная часть была ложна:
    • A¬P ∨ ¬Q = 1
       1      0
      
    • То есть получаем:
    • ¬P ∨ ¬Q = 0,
      или 
      P = 1 и Q = 1 
    • Таким образом имеем пересечение двух множеств Q и P:
    • A = {1}
      
    • Количество элементов = 1

    Задания с отрезками на числовой прямой

    Отрезки на числовой прямой:

    15_3:

    На числовой прямой даны два отрезка: P=[44,48] и Q=[23,35].

    Укажите наибольшую возможную длину отрезка А, для которого формула

    ((x ϵ P) → (x ϵ Q)) ∧ (x ϵ A)

    тождественно ложна, то есть принимает значение 0 при любом значении переменной x.

    Ответ: 4

    Показать решение:

    • Упростим формулу, избавившись от ‘x ϵ‘:
    • (P → Q) ∧ A
      
    • Теперь преобразуем импликацию в скобках:
    • правило импликации: a → b = ¬a ∨ b
      (¬P ∨ Q) ∧ A
      
    • Указанные в задании отрезки отобразим на числовой прямой. Разделим отрезки на части по точкам, соответствующим их границам.
    • решение 15 задания егэ по информатике

    • Вернемся к преобразованному выражению. В нем есть известная часть (выделим ее) и неизвестная. По условию выражение должно быть ложно:
    • (¬P ∨ Q) ∧ A = 0
    • Внешняя операция выражения — конъюнкция — ложна в трех случаях и только в одном — истинна:
    • (¬P ∨ Q) ∧ A
          0      0 = 0
          0      1 = 0
          1      0 = 0
          1      1 = 1
      
    • Теперь рассмотрим это выражение относительно наших отрезков на числовой прямой: если известная часть выражения (¬P ∨ Q) на каком-либо отрезке прямой дает истину, то неизвестная часть (A) должна возвращать ложь (по условию формула должна быть тождественно ложна).
    • Рассмотрим все отрезки числовой прямой для известной части выражения:
    • 1. (¬P ∨ Q) = 1 ∨ 0 = 1  - на данном отрезке А должно равняться 0
      2. (¬P ∨ Q) = 1 ∨ 1 = 1  - на данном отрезке А должно равняться 0
      3. (¬P ∨ Q) = 1 ∨ 0 = 1  - на данном отрезке А должно равняться 0
      4. (¬P ∨ Q) = 0 ∨ 0 = 0  - на данном отрезке А может! равняться 1
      5. (¬P ∨ Q) = 1 ∨ 0 = 1  - на данном отрезке А должно равняться 0
      
    • Получаем, что на всех отрезках кроме 4-го выражение ¬P ∨ Q истинно, т.е. на отрезках 1, 2, 3 и 5 неизвестная часть A должна быть ложной (чтобы формула вернула ложь). Отсюда следует, что А может быть истинно только на отрезке 4.
    • Длина отрезка 4 составляет:
    • 48 - 44 = 4

    ✎ Решение 2 (программирование):
    Внимание! этот способ подходит НЕ для всех заданий с отрезками!
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    def f(a1,a2,x):
        return((44<=x<=48)<=(23<=x<=35))and(a1<=x<=a2)
    maxim = 0
    for a1 in range (1,200):
        for a2 in range (a1+1,200):
            if all(f(a1,a2,x)==0 for x in range (1,200)):# если все ложны
                if a2-a1>maxim:
                    maxim=a2-a1
                    print(a1,a2, a2-a1) # сами точки отрезка и длина

    Вывод:

    44 45 1
    44 46 2
    44 47 3
    44 48 4
    

    PascalABC.net:

    1
    
     

    Вывод:

    
    

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Отрезки на числовой прямой:

    15_9:

    На числовой прямой даны два отрезка: P = [10,20] и Q = [30,40].
      
    Укажите наибольшую возможную длину отрезка A, для которого формула

    ((x ∈ P) → (x ∈ Q))  → ¬(x ∈ A)

    тождественно истинна, то есть принимает значение 1 при любом значении переменной x.

    Типовые задания для тренировки

    Ответ: 10

    Показать решение:

    • Упростим выражение, введя обозначения:
    • A: x ∈ A
      P: x ∈ P
      Q: x ∈ Q
      
    • Запишем формулу с новыми обозначениями, учитывая, что по условию она должна быть тождественно истинной:
    • (P → Q) → ¬A = 1
      
    • Избавимся от импликации:
    • (P → Q) → ¬A = 1        =>
      ¬(P → Q) ∨ ¬A = 1       =>
      ¬(¬P ∨ Q) ∨ ¬A = 1   
      
    • Используем закон Де Моргана для последующего преобразования:
    • ¬(¬P ∨ Q) ∨ ¬A = 1    =>
      P ∧ ¬Q ∨ ¬A = 1
      
    • А — наше неизвестное, а выделенную часть формулы можно найти. Необходимо, чтобы А = 1. Значит предположим, что ¬А = 0, тогда P ∧ ¬Q = 1 (если P ∧ ¬Q = 0, то ¬А может равняться и 0 и 1, так как имеет место операция логического сложения ∨)
    • Значит, имеем P ∧ ¬Q = 1. Кроме того, в данном случае имеет место операция конъюнкция, которую проще вычислить, если выражение равно 1 (так как для конъюнкции существует один единственный случай истинности: 1 & 1 = 1). Таким образом имеем утверждения:
    • А = 1
      P = 1
      ¬Q = 1 или Q = 0
      
    • Т.е. A истинно (=1) на промежутке пересечения отрезков P и ¬Q.
    • Отобразим отрезки на числовой прямой, чтобы найти искомое значение:
    • решение 15 задания ЕГЭ с числовой прямой

    • Очевидно, что А будет истинно, только в части 2 (на рис. желтым цветом), то есть соответствовать отрезку [10,20], имеющему длину 10.

    Отрезки на числовой прямой:

    15_10:

    На числовой прямой даны два отрезка: P = [3, 20] и Q = [6, 12].
      
    Укажите наибольшую возможную длину отрезка A, для которого формула

    ((x ∈ P) ~ (x ∈ Q))  → ¬(x ∈ A)

    тождественно истинна, то есть принимает значение 1 при любом значении переменной x.

    Ответ: 8

    Показать решение:

    • Упростим выражение, введя обозначения:
    • A: x ∈ A
      P: x ∈ P
      Q: x ∈ Q
      
    • Запишем формулу с новыми обозначениями, учитывая, что по условию она должна быть тождественно истинной:
    • (P ~ Q) → ¬A = 1
      
    • Избавимся от импликации:
    • (P ~ Q) → ¬A = 1      =>
      ¬(P ~ Q) ∨ ¬A = 1
      

      Далее возможно 2 способа решения.
        
      ✎ 1 способ:

    • Избавимся от эквивалентности по правилу преобразования эквивалентности:
    • (a ~ b) = a * b + ¬a * ¬b
      ¬(P ~ Q) = ¬((P ∧ Q) ∨ (¬P ∧ ¬Q)) =
      = ¬(P ∧ Q) ∧ ¬(¬P ∧ ¬Q) 
      
    • Преобразуем часть данного выражения по закону Де Моргана:
    • ¬(P ∧ Q) ∧ ¬(¬P ∧ ¬Q) =
      = ¬(P ∧ Q) ∧ (P ∨ Q) 
      
    • В итоге получим:
    • ¬(P ∧ Q) ∧ (P ∨ Q) ∨ ¬A = 1
    • А — наше неизвестное, а выделенную часть выражения можно найти. Необходимо, чтобы А = 1. Значит, предположим, что ¬А = 0, тогда, чтобы общее выражение было истинным (по условию), нужно чтобы ¬(P ∧ Q) ∧ (P ∨ Q) = 1.
    • Имеем:
    • ¬(P ∧ Q) ∧ (P ∨ Q) = 1
      А = 1
      
    • Отобразим отрезки на числовой прямой, чтобы найти искомое значение:
    • 15 задание  ЕГЭ отрезки

    • Очевидно, что А будет истинно в двух отмеченных на рисунке частях: 2 и 4 (на рис. желтым цветом). Но по условию нам необходимо найти А наибольшей длины, соответственно, выбираем отрезок [12,20], имеющий длину 8.
    • ✎ 2 способ:
      После того, как мы избавились от импликации, имеем:

      ¬(P ~ Q) ∨ ¬A = 1
      
    • А — наше неизвестное, а выделенную часть выражения можно найти. Необходимо, чтобы А = 1. Значит, предположим, что ¬А = 0, тогда ¬(P ~ Q) = 1 (чтобы общее выражение было истинным, как указанно в условии).
    • Иными словами ¬(P ~ Q) истинно для всех значений x, при которых P не равно Q (т.е. либо P = 1 и Q = 0, либо P = 0 и Q = 1).
    • Это соответствует двум отрезкам (см. рисунок выше, желтым цветом): [3,6] и [12,20]. Но по условию нам необходимо найти А наибольшей длины, соответственно выбираем отрезок [12,20], имеющий длину 8.

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Отрезки на числовой прямой:

    15_11:

    На числовой прямой даны два отрезка: P = [11, 21] и Q = [15, 40].
      
    Укажите наибольшую возможную длину отрезка A, для которого формула

    (x ∈ A) → ¬((x ∈ P)  ~ (x ∈ Q))

    тождественно истинна, то есть принимает значение 1 при любом значении переменной x.

    Типовые задания для тренировки

    Ответ: 19

    Показать решение:

    • Упростим выражение, введя обозначения:
    • A: x ∈ A
      P: x ∈ P
      Q: x ∈ Q
      
    • Запишем формулу с новыми обозначениями, учитывая, что по условию она должна быть тождественно истинной:
    • A → ¬(P ~ Q) = 1
      
    • Избавимся от импликации:
    • A → ¬(P ~ Q) = 1    =>
      ¬A ∨ ¬(P ~ Q) = 1
      
    • А — наше неизвестное, тогда как выделенную часть формулы можно найти. Введем предположение, что А = 1. Значит, ¬А = 0 (т.е. А = 1), тогда ¬(P ~ Q) = 1 (так как общая формула должна быть истинной по условию).
    • Иными словами ¬(P ~ Q) истинно для всех значений x, при которых P не равно Q (т.е. либо P = 1 и Q = 0, либо P = 0 и Q = 1).
    • Отобразим отрезки на числовой прямой, чтобы найти искомое значение:
    • 15 задание отрезки на числовой прямой

    • Получаем, что А соответствует двум отрезкам (см. рисунок, желтым цветом): [11,15] и [21,40]. Но по условию нам необходимо найти А наибольшей длины, соответственно выбираем отрезок [21,40], имеющий длину 19.

    Задания с ДЕЛ

    Поиск наибольшего А, известная часть Дел ∨ Дел = 1

    15_7:

    Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».

      
    Для какого наибольшего натурального числа А формула

      (ДЕЛ(x, 40) ∨ ДЕЛ(x, 64))  → ДЕЛ(x, A) 

    тождественно истинна (то есть принимает значение 1 при любом натуральном значении переменной х)?

    Типовые задания для тренировки

    Ответ: 8

    Показать решение:

    ✎ Решение 1 (теоретическое):

    • Введем обозначения:
    • A = ДЕЛ(x,A); 
      D40 = ДЕЛ(x, 40); 
      D64 = ДЕЛ(x, 64)
      
    • Перепишем исходную формулу, согласно введенным обозначениям. Укажем, что формула должна быть тождественно истинна (по условию):
    • (D40 ∨ D64)  → A = 1
      
    • Избавимся от импликации:
    • ¬(D40 ∨ D64) ∨ A = 1
      или
      (¬D40 ∧ ¬D64) ∨ A = 1
      
    • Разделим данную формулу на две части: в одной из них — искомое A, а в другой — часть формулы с x, которую можно найти:
    • (¬D40 ∧ ¬D64) ∨ A = 1
            1          2
      
    • В полученной формуле необходимо, чтобы искомая часть с A в конечном счете было истинно.

      Т.е. (¬D40 ∧ ¬D64) должно быть = 0. Это нам ничего не дает, т.к. конъюнкция ложна в трех случаях (1*0, 0*1 и 0*0), т.е. D40 и D64 могут быть равны как 0, так и 1 (исключение составляет лишь вариант, когда оба D истинны, тогда логическое умножение 1 * 1 ≠ 0).

    • Преобразуем выражение первой части формулы по закону Де Моргана (чтобы оно равнялось 1):
    • ¬D40 ∧ ¬D64 = 0
      или
      ¬(¬D40 ∧ ¬D64) = 1
      
      Преобразуем по закону Де Моргана и получим:
      D40 ∨ D64 = 1
      

        
      Далее можно решать задание либо с помощью кругов Эйлера, либо с помощью логических рассуждений.

      Решение с помощью логических рассуждений:

    • Найдем все такие x, которые делятся на А и при этом делятся на 40 ИЛИ делятся на 64:
    • x/A : x/40 ∨ x/64
      x = 40, 64, 80, 120, 128, 160, 192, 200, ...
    • Теперь найдем такие A, начиная с самого наименьшего (единицы), на которые делятся все x без исключения:
    • А = 1, 2, 4, 8
    • Наибольшее А равно 8.
    • Или то же самое можно найти поиском наибольшего общего делителя чисел 40 и 64 (используем формулу Евклида):
    • НОД (40,64) = 8 
      40,64  (64 - 40 = 24)
      40,24  (40 - 24 = 16)
      24,16  (24 - 16 = 8)
      16,8   (16 - 8 = 8)
      8,8
      

      Решение с помощью кругов Эйлера:

    • В этом случае логическое сложение тоже дает истину в трех случаях (1+1, 1+0, 0+1). Т.е. мы не сможем найти А с помощью функции ДЕЛ. Необходимо прибегнуть к решению с помощью кругов Эйлера.
    • В множество A должны входить все числа, которые попадают в объединение D40 + D64. Таким образом, нужно найти множество, в которое входят оба этих множества.
    • Найдем наибольший общий делитель чисел 40 и 64; это число 8:
    • 64 / 40 = 1 (24 остаток)
      40 / 24 = 1 (16 остаток)
      24 / 16 = 1 (8 остаток)
      16 / 8 = 2 (0 остаток) - НОД = 8
      +++
      40 / 8 = 5
      64 / 8 = 8
      
    • Т.е. можно сказать, что A = D40 + D64 = D8*D5 + D8*D8 = D8*(D5 + D8). D8 входит в каждое из множеств D40 и D64. Объединение D40 + D64 тоже входит в D8:
    • 2

    • 8 — наибольший общий делитель числе 40 и 64, значит, оно соответствует максимальному значению A.

    Результат: 8

    ✎ Решение 2 (программирование):
    Python:

    1
    2
    3
    4
    5
    6
    
    for A in range(1,500):
        OK = 1
        for x in range(1,1000):
            OK *= ((x % 40 == 0) or (x % 64 == 0))<=(x % A== 0)
        if OK:
            print( A )

    Вывод:

    1
    2
    4
    8
    

    PascalABC.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    begin
      for var A := 1 to 500 do
      begin
        var ok := 1;
        for var x := 1 to 1000 do
        begin
          if (((x mod 40 = 0) or (x mod 64 = 0)) <= (x mod A = 0)) = false then
          begin
            ok := 0; 
            break;
          end;
        end;
        if (ok = 1) then print(A)
      end;
    end.

    Вывод:

    1
    2
    4
    8
    

    Результат: 8


    Поиск наименьшего А, известная часть Дел ∧ ¬Дел = 1

    15_5:

    Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».

     
    Для какого наименьшего натурального числа А формула

    ДЕЛ(x, A) → (¬ДЕЛ(x, 28) ∨ ДЕЛ(x, 42))

    тождественно истинна (то есть принимает значение 1 при любом натуральном значении переменной х)?

    Типовые задания для тренировки

    Ответ: 3

    Показать решение:

    ✎ Решение 1 (теоретическое):

      Имеем:

      ДЕЛ(x, A) → (¬ДЕЛ(x, 28) ∨ ДЕЛ(x, 42)) = 1 
    • Введем обозначения:
    • A = ДЕЛ(x,A); 
      D28 = ДЕЛ(x, 28); 
      D42 = ДЕЛ(x, 42)
      
    • Перепишем исходную формулу, согласно введенным обозначениям. Укажем, что формула должна быть тождественно истинна (по условию):
    • A → (¬D28 ∨ D42) = 1
      

      Избавимся от импликации:

      ¬A ∨ (¬D28 ∨ D42) = 1
      
    • Разделим данную формулу на две части: в одной из них — искомое A, а в другой — часть формулы с x, которую можно найти:
    • ¬A ∨ (¬D28 ∨ D42) = 1
       1        2
      
    • В части 2 полученной формулы находится операция дизъюнкция, которую проще найти, когда логическое выражение равно 0 (только один случай: 0 ∨ 0 = 0):
    • (¬D28 ∨ D42) = 0   один случай: когда ¬D28 = 0 и D42 = 0

    • Т.е. имеем:
    • x/¬A : x/28 ∧ x/¬42
    • Иными словами найдем все такие x, которые НЕ делятся на А и при этом делятся на 28 И НЕ делятся на 42:
    • x = 28, 56, 84, 112, 140, 168, 196, 224, ...
    • Теперь найдем такие A, начиная с самого наименьшего (единицы), на которые НЕ делятся все x без исключения:
    • А = 1, 2, 3
    • Наименьшее А равно 3.

    ✎ Решение 2 (программирование). Язык Python, Pascal:

      Из общего выражения:

      ДЕЛ(x, A) → (¬ДЕЛ(x, 28) ∨ ДЕЛ(x, 42)) = 1 
    • Можно сделать вывод, что для некоторого диапазона натуральных значений А, необходимо рассмотреть диапазон натуральных значений x. Если выражение будет истинным для диапазона всех рассматриваемых х, то такое А необходимо вывести на экран.
    • То есть следует рассмотреть вложенный цикл: для внешнего цикла, перебирающего значения А (ограничим их числом 50, т.к. необходимо найти наименьшее А), будем запускать внутренний цикл, перебирающий значения х (х ограничим числом 1000, будем рассматривать данный диапазон, как «любое натуральное значение переменной х»).
    • Во внутреннем цикле расположим формулу:
    • Python:

      for A in range(1,50):
          OK = 1
          for x in range(1,1000):
              OK *= (x % A == 0) <= ((x % 28 != 0) or (x % 42== 0))
          if OK:
              print( A )
              break

      PascalABC.net:

      begin
        for var A := 1 to 50 do
        begin
          var ok := 1;
          for var x := 1 to 1000 do
          begin
            if (x mod A = 0) <= ((x mod 28 <> 0)or (x mod 42 = 0)) = false then
            begin
              ok := 0; 
              break;
            end;
          end;
          if (ok = 1) then begin
            print(A);
            break;
            end
        end;
      end.
      OK — переменная-индикатор: если находится такое А при котором, диапазон всех значений x, подставленных в выражение, возвращает истинное значение выражения, то ОК остается равным 1, т.к. используется операция умножения (до цикла ОК необходимо присвоить единице).
      Следует иметь в виду, что в программировании вместо операции импликация (->) можно использовать нестрогое неравенство: <=. Т.к. таблица истинности для операции импликация соответствует операции <=:

      a b   F(a<=b)
      0 0      1
      0 1      1
      1 0      0
      1 1      1  
      
    • После запуска программы выдается наименьшее значение А, т.к. используется оператор break для выхода из цикла после первого найденного значения:
    • 3
      

    Результат: 3


    Задание с ДЕЛ:

    15_6:

    Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».

      
    Для какого наименьшего натурального числа А формула

     (¬ДЕЛ(x, 19) ∨ ¬ДЕЛ(x, 15)) → ¬ДЕЛ(x, A) 

    тождественно истинна (то есть принимает значение 1 при любом натуральном значении переменной х)?

    Ответ: 285

    Показать решение:

    ✎ Решение 1 теоретическое:

    • Введем обозначения:
    • A = ДЕЛ(x,A); 
      D19 = ДЕЛ(x, 19); 
      D15 = ДЕЛ(x, 15)
      
    • Перепишем исходную формулу, согласно введенным обозначениям. Укажем, что формула должна быть тождественно истинна (по условию):
    • (¬D19 ∨ ¬D15) → ¬A = 1
      
    • Избавимся от импликации:
    • D19 ∧ D15 ∨ ¬A = 1
      
    • Разделим данную формулу на две части: в одной из них - искомое A, а в другой - часть формулы с x, которую можно найти:
    • ¬A ∨ D19 ∧ D15 = 1
       1       2
      
    • Начнем с известной части - части 2 формулы. В ней находится операция конъюнкция, которую проще найти, когда все ее операнды равны 1 (единственный случай для конъюнкции: 1 ∧ 1 = 1).
    • Вторая часть общей формулы может равняться только 1, когда ¬A = 0 (если ¬A = 1, то вторая часть может равнять 0, а нам нужно 1) :
    • ¬A ∨ D19 ∧ D15 = 1
       0       1      = 1
      
    • Т.е. получаем:
    • ¬A = 0 при D19 ∧ D15 = 1
      или
      A = 1 при D19 = 1 и D15 = 1
      
    • Таким образом, имеем:
    • A = 1
      D19 = 1
      D15 = 1
      
    • Очевидно, что наименьшим x можем взять число 285 (15 * 19 = 285): ДЕЛ(285, 19) и ДЕЛ(285, 15)
    • Поскольку мы ищем наименьшее A, такое что: ДЕЛ(x, A) и при этом ДЕЛ(x, 19) и ДЕЛ(x, 15), то нам необходимо найти наименьшее делимое чисел 19 и 15:
    • 19 * 2 = 38 (38 не делится на 15)
      19 * 3 = 57 (57 не делится на 15)
      19 * 4 = 76 (76 не делится на 15)
      19 * 5 = 95 (95 не делится на 15)
      ...
      19 * 10 = 190 (190 не делится на 15)
      19 * 15 = 285 (285 делится на 15)
      
    • A должно быть таким числом, при котором x принимает единственно возможное (наименьшее) значение 285:
    • Таким наименьшим A является само число 285.

    ✎ Решение 2 (программирование):
    Python:
    Из общего выражения:

     (¬ДЕЛ(x, 19) ∨ ¬ДЕЛ(x, 15)) → ¬ДЕЛ(x, A)  = 1
  • Можно сделать вывод, что для некоторого диапазона натуральных значений А, необходимо рассмотреть диапазон натуральных значений x. Если выражение будет истинным для диапазона всех рассматриваемых х, то такое А необходимо вывести на экран.
  • То есть следует рассмотреть вложенный цикл: для внешнего цикла, перебирающего значения А (ограничим их числом 500, т.к. необходимо найти наименьшее А), будем запускать внутренний цикл, перебирающий значения х (х ограничим числом 1000, будем рассматривать данный диапазон, как "любое натуральное значение переменной х").
  • Во внутреннем цикле расположим формулу:
  • for A in range(1,500):
        OK = 1
        for x in range(1,1000):
            OK *= ((x % 19 != 0) or (x % 15 != 0))<= (x % A!= 0)
        if OK:
                print( A )
    OK - переменная-индикатор: если находится такое А при котором, диапазон всех значений x, подставленных в выражение, возвращает истинное значение выражения, то ОК остается равным 1, т.к. используется операция умножения (до цикла ОК необходимо присвоить единице).
    Следует иметь в виду, что в программировании вместо операции импликация (->) можно использовать нестрогое неравенство: <=. Т.к. таблица истинности для операции импликация соответствует операции <=:

    a b   F(a<=b)
    0 0      1
    0 1      1
    1 0      0
    1 1      1  
    
  • После запуска программы выдается одно значение А:
  • 285
    

    Задание с ДЕЛ:

    Задания с поразрядной конъюнкцией

    Поразрядная конъюнкция:

    15_1:

    Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Так, например, 12&6 = 11002&01102 = 01002 = 4

      
    Для какого наименьшего неотрицательного целого числа A формула

    (X & A = 0) ∧ ¬(X & 35 ≠ 0 → X & 52 ≠ 0)

    тождественно ложна (то есть принимает значение 0 при любом неотрицательном значении переменной X)?

    Ответ: 3

    Показать решение:

    Стоит заметить, что для такого типа задач, нет универсального единственного решения. Поэтому на видео, расположенном ниже, представлено два варианта решения.

    Рассмотрим один из вариантов решения:

    • Удалим из формулы X&, чтобы сократить ее запись:
    • (A = 0) ∧ ¬(35 ≠ 0 → 52 ≠ 0)
      
    • Обратим внимание, что внешней операцией является конъюнкция - логическое умножение:
    • (A = 0)  ¬(35 ≠ 0 → 52 ≠ 0)
      
    • Разделим общее выражение на две части относительно внешней операции. Первая часть - неизвестная, искомая, а вторая - известная, ее можно вычислить:
    • (A = 0) ∧ ¬(35 ≠ 0 → 52 ≠ 0)
         1               2
      
    • Выполним некоторые преобразования во второй части формулы:
    • Зная свойство импликации, преобразуем формулу (избавимся от импликации в скобках):
    • правило импликации: a → b = ¬a ∨ b
      (A = 0) ∧ ¬(35 = 0 ∨ 52 ≠ 0)
      т.к. в результате получается отрицание того, что 35 ≠ 0, 
      то убираем знак "не равно": было 35 ≠ 0, стало 35 = 0
      
    • Избавимся от отрицания перед скобками по закону Де Моргана:
    • закон де Моргана: ¬ (A ∨ B) = ¬ A ∧ ¬ B
      A = 0 ∧ 35 ≠ 0 ∧ 52 = 0 = 0
    • По условию формула должна быть ложной. Вспомним таблицу истинности для конъюнкции (внешняя операция в нашей общей формуле):
    • 0 ∧ 0 = 0
      0 ∧ 1 = 0
      1 ∧ 0 = 0
      1 ∧ 1 = 1
      
    • Вторая часть формулы - вычислима, поэтому начнем с нее. В ней находится операция конъюнкция, которая имеет один единственный вариант решения, когда ¬ A ∧ ¬ B = 1. То есть примем вторую часть за истину (=1). В таком случае, для того чтобы общее выражение стало ложным (так требуется по заданию), необходимо, чтобы утверждение, что A = 0 было ложным (т.к. в обратном случае получим: 1 ∧ 1 = 1):
    • (A = 0) ∧ 35 ≠ 0 ∧ 52 = 0 = 0
         0            1    = 0 
      
    • Вторая часть будет истинной только в том случае, если оба утверждения будут истинными:
    • 35 ≠ 0 ∧ 52 = истинно (=1)  если:
      35 ≠ 0 = истинно (=1)
      и
      52 = 0 = истинно (=1)
      
      так как стоит логическое умножение  - 
      смотрим выше таблицу истинности для конъюнкции
      
    • Из двух последних пунктов получаем три утверждения:
    • 35 ≠ 0  = 1  (истина)
      и
      52 = 0  = 1  (истина)
      и
      A = 0   = 0  (ложь)
      
    • Переведем числа в двоичную систему счисления:
    • 35: 100011  (≠ 0)
      52: 110100 (= 0)
      
    • Найдем такой X, который при поразрядной конъюнкции даст истинное значение для обеих частей.
    • Для начала рассмотрим ситуацию с числом 52 - это проще, т.к. для получения в результате нуля (52 = 0 => истина), достаточно во всех разрядах "перекрыть" единицы нулями:
    • 52 1 1 0 1 0 0
      X 0 0 ? 0 ? ?
    • Мы "перекрыли" все единицы нулями, чтобы в результате получить 0.
    • Теперь рассмотрим 35 ≠ 0 = истина:
    • 35 1 0 0 0 1 1
      X 1 ? ? ? 1 1
    • Объединим обе маски в одну:
    • 0 0 ? 0 ? ?&
      1 ? ? ? 1 1
      0 0 ? 0 1 1
      
    • Так как выражение X & A = 0 должно быть ложным, то найдем такое наименьшее А, при котором X & A ≠ 0. Для этого в тех разрядах Х, в которых находится единица, необходимо сохранить эту единицу и в соответствующих разрядах А:
    • X 0 0 ? 0 1 1
      A 0 0 0 0 1 1
    • Переведем результат в десятичную систему счисления:
    • 0000112 = 310

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Поразрядная конъюнкция:

    15_2:

    Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n. Так, например, 12&6 = 11002&01102 = 01002 = 4

      
    Для какого наибольшего неотрицательного целого числа A формула

    X & A ≠ 0 → (X & 36 = 0 → X & 6 ≠ 0)

    тождественно истинна (то есть принимает значение 1 при любом неотрицательном значении переменной X)?

    Ответ: 38

    Показать решение:

      ✎ Способ 1:

    • Произведем замену:
    • z36 = (x&36 = 0), z6 = (x&6 = 0), A = (x&A = 0)
      
    • Перепишем выражение:
    • ¬A → (z36 → ¬ z6)
      
    • Избавимся от импликации (A → B = ¬ A ∨ B):
    • Сначала по правилу преобразования импликации:
    • ¬A → (z36 → ¬ z6) = A + ¬z36 + ¬z6 
      
    • По Закону де Моргана вынесем отрицание за скобки (¬ (A ∧ B) = ¬ A ∨ ¬ B):
    • A + ¬z36 + ¬z6 = A + ¬(z36 * z6)
      
    • Вернемся опять к импликации:
    • A + ¬(z36 * z6) = ¬(z36 * z6) + A = (z36 * z6) → A
      
    • Суть предыдущих действий в том, что нам сначала нужно прийти к конъюнкции, а затем необходимо прийти к импликации, но, избавившись от отрицания.
    • По следующему правилу ZK * ZM = ZK or M (К. Поляков) заменим конъюнкцию:
    • z36 * z6 = z36 or 6
    • Выполним поразрядную дизъюнкцию двоичных чисел 36 и 6:
    • 1001002 -> 36
      1102 -> 6
      
      100100
      +
         110
      1001102 -> 36 or 6 = 3810
      
    • Получаем:
    • z38 → A
      
    • Необходимо обеспечить истинность данного выражения при всех x. Это возможно, когда единичные биты A входят в единичные биты числа 38. То есть:
    • A = 1001102 = 3810

        
      ✎ Способ 2:

    • Так как по заданию формула должна быть тождественно истинна, то перепишем ее так:
    • x&A ≠ 0 → (x&36 = 0 → x&6 ≠ 0) = 1
    • Введем обозначения:
    • A = (x&A = 0);
      P = (x&36 = 0);
      Q = (x&6 = 0);
      
    • Перепишем выражение согласно введенным обозначениям:
    • ¬A → (P → ¬Q) = 1
      
    • Избавимся от импликации:
    • A ∨ (¬P ∨ ¬Q) = 1
      
    • A - наше неизвестное; для части выражения ¬P ∨ ¬Q нам необходимо подобрать такой вариант (равный 0 или 1), при котором единственно возможным значением A была бы единица (1).
    • Возьмем (¬P ∨ ¬Q) = 0, тогда А должно быть только единицей (чтобы общее выражение было = 1):
    • A ∨ (¬P ∨ ¬Q) = 1; 
      или 
      1 ∨ (0) = 1
      
    • Иными словами, выражение истинно, если при ¬P ∨ ¬Q = 0, A равно единице (1).
    • Получаем:
    • ¬P ∨ ¬Q = 0
      Отсюда имеем: 
      ¬P = 0 и ¬Q = 0 
      
      (дизъюнкция равна 0 в единственном случае, когда все операнды равны 0)
      
    • Или запишем другим образом:
    • Q = 1 и P = 1
    • Построим побитовые маски:
    • 100100  : 36
      000110  : 6
      0**0**  : маска P (x&36 = 0)
      ***00*  : маска Q (x&6 = 0)
      
    • Сопоставим обе маски и маску x&A = 0:
    • 0**0**  : маска P (x&36 = 0)
      ***00*  : маска Q (x&6 = 0)
      0**00*  : общая маска x
      *00**0  : маска для A (x&A = 0)
      т.е. в тех битах А, где может получиться единица (звездочки в обеих масках),
      мы поставили нули.
    • Так как нам необходимо получить наибольшее A (по заданию), то вместо всех "звездочек" ставим единицы:
    • 100110 = 3810
      

    Результат: 38

    📹 Видео 1
    📹 Видеорешение на RuTube здесь

    📹 Видео 2
    📹 Видеорешение на RuTube здесь


    Поразрядная конъюнкция:

    15_8:

    Определите наименьшее натуральное число А из интервала [43, 55], такое, что выражение

    ((x & 17 ≠ 0) → ((x & A ≠ 0) → (x & 58 ≠ 0))) →
    → ((x & 8 = 0) ∧ (x & A ≠ 0) ∧ (x & 58 = 0))

    тождественно ложно (то есть принимает значение 0 при любом натуральном значении переменной х)?

    Типовые задания для тренировки

    Ответ: 48

    Показать решение:

      Кратко изложенное решение *:

    • Введем обозначения:
    • (¬Z17 → (¬A → ¬Z58)) → (z8 ∧ ¬A ∧ Z58) = 0
      
    • Для того, чтобы выражение было истинным, поставим его с отрицанием:
    • ¬(((¬Z17 → (¬A → ¬Z58)) → (z8 ∧ ¬A ∧ Z58)) = 1
       
    • Упростим выделенную часть выражения (свойство 1, теория):
    • Z8 ∧ Z58 = Z8 or 58  :
      
      8  =   1000  or
      58 = 111010
           111010 = 58
      
    • Получили:
    • Z8 ∧ Z58 = Z58
       
    • Перепишем все выражение снова, избавившись от импликации:
    • ¬(¬(Z17 ∨ A ∨ ¬Z58) ∨ (¬A ∧ Z58)) = 1
       
    • По закону Де Моргана получим:
    • (Z17 ∨ A ∨ ¬Z58) ∧ ¬(¬A ∧ Z58)) = 1
       
    • Еще раз применим закон теперь ко второй скобке:
    • (Z17 ∨ A ∨ ¬Z58) ∧  (A ∨ ¬Z58) = 1
      
    • Используем закон поглощения:
    • A ∨ ¬Z58 = 1
      
    • Приведем к импликации, чтобы избавиться от отрицания:
    • ¬Z58 ∨ A => 
       Z58 → A = 1
      
    • Поскольку по заданию нас интересует диапазон [43;55], то проверять будет с числа 43.
    • По свойству 3 (теория), необходимо, чтобы единичные биты А входили в единичные биты двоичного представления числа 58:
    • 43 = 101011 - не подходит!
      58 = 111010
      
      44 = 101100 - не подходит!
      58 = 111010
      
      45 = 101101 - не подходит!
      58 = 111010
      
      46 = 101110 - не подходит!
      58 = 111010
      
      47 = 101111 - не подходит!
      58 = 111010
      
      48 = 110000 - подходит!
      58 = 111010
      

    Результат: 48


    Поразрядная конъюнкция:

    15_15:

    Определите набольшее натуральное число A, такое что выражение

    ((x & 26 = 0) ∨  (x & 13 = 0)) → ((x & 78 ≠ 0) → (x & A = 0))

    тождественно истинно (то есть принимает значение 1 при любом натуральном значении переменной х)?

    Типовые задания для тренировки

    Ответ: 8

    Показать решение:

    • Для упрощения восприятия введем обозначения:
    • z26 = (x & 26 = 0)
      z13 = (x & 13 = 0)
      z78 = (x & 78 = 0)
      A = (x & A = 0)
      
    • Таким образом, получим следующее выражение:
    • (z26 ∨ z13) → (¬z78 → A) = 1
      
    • Упростим выражение по свойству импликации для второй скобки:
    • (z26 ∨ z13) → (z78 ∨ A) = 1
      
    • Упростим левую часть, используя свойство 2 (Zk + Zm = Zk and m):
    • 26 : 11010   единичные биты: 4, 3, 1
      13 :  1101   единичные биты: 3, 2, 0
      ∧ =------------------------
           01000 = 810
      
    • То есть получили z26 ∨ z13 = z8
    • По правилу импликации: все единичные биты двоичной записи результата (z78 ∨ A) должны входить во множество единичных битов двоичной записи z8.
    • Рассмотрим:
    • z8 → (z78 ∨ A)
      z78: не влияет на решение, так как операция дизъюнкция истинна тогда, 
      когда хотя бы один операнд истинен
      z8 → A     : ????
      
    • Для А единичными битами должны быть общие единичные биты для z8 (10002). Т.е. в нашим случае - это один бит - 3-й:
    • Наибольшее А = 1000 = 810
      

    Результат: 8


    Задания на поиск наибольшего или наименьшего числа А

    Поиск наибольшего или наименьшего числа А:

    15 задание. Демоверсия ЕГЭ 2018 информатика:

    Для какого наибольшего целого числа А формула
    демоверсия егэ 2018 решение 15 (18) задания
    тождественно истинна, то есть принимает значение 1 при любых целых неотрицательных x и y?

    Ответ: 99

    Показать решение:

    ✎ Способ 1 (программный):

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

    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    begin
      for var A := 200 downto -100 do
      begin
        var OK := 1;
        for var x := 0 to 100 do
          for var y := 0 to 100 do
            if ((x <= 9) <= (x * x <= A)) and ((y * y <= A) <= (y <= 9)) = false then 
            begin
              OK := 0;
              break;
            end;
        if OK = 1 then 
        begin
          print(A);
          break
        end;
      end;
    end.
    Бейсик:

     
    Python:

    for A in range(200,-100,-1):
        OK = 1
        for x in range(0,100):
            for y in range(0,100):
                OK *= ((x<=9) <= (x*x<=A)) and((y*y<=A) <= (y<=9)) 
        if OK:
            print(A)
            break
    С++:

     

    ✎ Способ 2 (теоретическое решение):

    • Условно разделим исходное выражение на части:
    • решение 15 задания демоверсии егэ информатика

    • Главное действие (внешняя операция) в исходном выражении - это конъюнкция. Конъюнкция истинна, когда все операнды истинны. Т.е. в задаче обе части 1 и 2 должны быть истинными (т.к. по условию общая формула должна быть истинной).
      Рассмотрим часть 1:

    • если в 1.1 имеем x > 9, то часть 1 будет истинна независимо от А. Значит, значение числа А влияет на решение только при выполнении условия:
    • x<=9

      (импликация 0 → 0 = 1, 0 → 1 = 1)

    • теперь, для того чтобы в части 1, выражение было истинным, надо чтобы часть 1.2 была истинной:
    • x*x <= A

      (импликация 1 → 1 = 1)

    • таким образом, получаем:
    • x <= 9
      x2 <= A
      
      при любых x
      
    • так как нам необходимо найти наибольшее возможное А, то, значит, надо ограничить его значения сверху, а данная часть выражения ограничивает только снизу:
    • возьмем наибольшее натуральное: x=9, тогда A>=81

      Рассмотрим часть 2:

    • если 2.2 истинно (т.е. y <= 9), то часть 2 будет истинна независимо от А. Значит, значение числа А влияет на решение только при выполнении условия:
    • y > 9
    • теперь, для того чтобы в части 2 выражение было истинным, надо чтобы часть 2.1 была ложной:
    • y * y > A

      (импликация 0 → 0 = 1)

    • таким образом, получаем:
    • y > 9
      y2 > A
      
      при любых y
      
    • данная часть выражения ограничивает значения А сверху:
    • возьмем наименьшее возможное по условию натуральное: y = 10, тогда A < 100
    • Получаем, что наибольшее А меньшее 100: А = 99

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Поиск наибольшего или наименьшего числа А:

    Досрочный егэ по информатике 2018, вариант 1:

    Укажите наименьшее значение А, при котором выражение

    (y + 3x < A) ∨ (x > 20) ∨ (y > 40)

    истинно для любых целых положительных значений x и y.

    Типовые задания для тренировки: разбор досрочного егэ по информатике 2019

    Ответ: 101

    Показать решение:

    ✎ Способ 1 (программный):

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

    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    begin
      for var A := -100 to 200 do
      begin
        var OK := 1;
        for var x := 1 to 100 do
          for var y := 1 to 100 do
            if ((y+3*x<A) or (x >20)or(y>40)) = false then 
            begin
              OK := 0;
              break;
            end;
        if OK = 1 then 
        begin
          print(A);
          break
        end;
      end;
    end.
    Бейсик:

     
    Python:

    for A in range(-100,200):
        OK = 1
        for x in range(1,100):
            for y in range(1,100):
                OK *= (y+3*x<A) or (x > 20) or (y > 40) 
        if OK:
            print(A)
            break
    С++:

     

    ✎ Способ 2 (теоретическое решение):

    • Определим основные части выражения, выделив отдельно неизвестную часть - с А, и, так сказать, известную часть, то есть остальную.
    •     1                 2
      (y+3x < A) ∨ (x > 20) ∨ (y > 40)
      
    • Поскольку основными операциями являются операции дизъюнкции (логического сложения) и порядок их выполнения не важен, то последней, внешней, операцией будем выполнять дизъюнкцию слева, т.к. она объединяет неизвестную и известную часть.
    • Сначала важно рассмотреть вторую часть выражения, известную, так как от нее будет зависеть значение A. Если вторая часть истинна, то А может быть как = 1, так и = 0. Такой вариант нам не подходит:
    • (y+3x < A) ∨ (x > 20) ∨ (y > 40)
        1 или 0?                   1               = 1
      Не подходит!
      
    • Соответственно, рассмотрим вариант, когда вторая часть ложна, тогда часть выражения с неизвестным А будет обязательно истинной, т.е.:
    • 1. (y+3x < A) = 1
      2. (x > 20) ∨ (y > 40) = 0
      
    • Дизъюнкция ложна, когда оба операнда ложны, т.е. из второго пункта имеем:
    • x <= 20
      y <= 40
      
    • Для того, чтобы перекрыть все x и все y, возьмем наибольшие из возможных значений: x = 20, y = 40.
    • Выразим А:
    • А > 3x + y
      A > 3*20 + 40
      A > 100 
      
    • Поскольку требуется найти наименьшее значение А, то имеем А = 101.

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Поиск наибольшего и наименьшего числа A:

    Разбор 15 задания. Демоверсия егэ по информатике 2019:

    Для какого наибольшего целого неотрицательного числа А выражение
      
    (48 ≠ y + 2x) ∨ (A < x) ∨ (A < y)
     
    тождественно истинно, т.е. принимает значение 1 при любых целых неотрицательных x и y?

    Ответ: 15

    Показать решение:

    ✎ Решение 1 (теоретическое):

    • Разделим общее выражение на две части. Выделим неизвестную часть красным:
    • (48 ≠ y + 2x) ∨ (A < x) ∨ (A < y)
      
    • Неизвестная часть должна быть истинной, она обязательно будет истинна, если известная часть — ложь:
    • (48 ≠ y + 2x) ∨ (A < x) ∨ (A < y) = 1
            0                  1
      
    • Т.е. 48 ≠ y + 2x = 0 или y + 2x = 48. На графике это уравнение представляет линию. Из условия имеем два ограничения:(x > 0) and (y > 0). Отобразим линию для 1-й четверти, соответствующей положительным x и y:
    • y + 2x = 48  :
      при x = 0, y = 48
      при y = 0, 2x = 48 => x = 24
      

      решение 15 (18) задания демоверсии егэ 2019

    • Возьмем некоторое значение A, например, A = 25, отметим его на графике белой областью так, чтобы выполнялось (A < x) ∨ (A < y). По условию имеем, что все точки данной части отрезка прямой y + 2x = 48 должны принадлежать отмеченной белой области. Заштрихуем область для всех точек прямой (голубым цветом):
    • То есть все точки голубого квадрата должны находиться под отрезком линии (включая вершину (A, A)), и данный квадрат, соответствует максимальному значению A.
    • Наибольшее значение голубая область приобретает в точке пересечения прямой y + 2x = 48 с прямой y = x:
    • линия на графике для решения 15 задания егэ

    • Далее решаем полученное линейное уравнение (для x = y):
    • x + 2x = 48 =>
      3x = 48
      x = 16
      
    • Так как значение A должно быть меньше x, то наибольшее А = 15.

    ✎ Решение 2 (программное):
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    for A in range(200,0,-1):
        OK = 1
        for x in range(0,100):
            for y in range(0,100):
                OK *= (48!=y+2*x) or(A<x)or (A<y) 
        if OK:
            print(A)
            break

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Поиск наибольшего и наименьшего числа A:

    15_19:

    Для какого наименьшего целого числа А формула
      
    (y + 5x <= 34) → ((y - x > 4) ∨ (y <= A))
     
    тождественно истинна, т.е. принимает значение 1 при любых целых неотрицательных x и y?

    Ответ: 9

    Показать решение:

    • Общая идея такова:
      необходимо упростить формулу так, чтобы последняя операция (внешняя) выполнялась со скобкой, в которой находится искомое A. После чего разделить формулу на две части, в одной из которых находится искомое.
    • Избавимся от импликации, это даст нам возможность опустить общие скобки во второй части формулы:
    • ¬(y + 5x <= 34) ∨ (y - x > 4) ∨ (y <= A)
      
    • Разделим формулу на две части таким образом, чтобы внешняя операции отделяла часть, в которой находится искомое A:
    • ¬(y + 5x <= 34) ∨ (y - x > 4)(y <= A) = 1
              1 часть                  2 часть
      
    • Формула по условию должна быть истинной (=1). Внешняя операция — дизъюнкция — истинна аж в трех случаях: a=1 b=0, a=0 b=1, a=1 b=1.
    • Если мы допустим, что первая часть истинна, то вторая, искомая часть, может быть как истинной, так и ложной. Поэтому такой вариант не подходит.
    • Допустим, что первая часть ложна, тогда вторая, искомая часть, должна быть только истинной:
    • ¬(y + 5x <= 34) ∨ (y - x > 4)(y <= A) = 1
              1 часть = 0               2 часть = 1
      
    • С учетом, что в первой части формулу находится операция дизъюнкция, которая ложна только в одном случае (a=0 b=0), то выпишем утверждения, получившиеся из первой части:
    • y + 5x > 34 = 0, значит:
      1. y + 5x <= 34
      y - x > 4 = 0, значит:
      2. y - x <= 4
      
    • Кроме того, имеем еще одно утверждение второй части:
    • y <= A
      или
      A >= y
      
    • Отобразим получившиеся уравнения прямых на плоскости:
    • решение 15

    • Раз A >= y, значит, искомая область лежит выше обеих прямых. Наименьшее значение А будет достигнуто в указанной точке пересечения двух прямых.
    • В точке пересечения прямых уравнения равны, т.е. имеем:
    • 34 - 5x = 4 + x
      30 = 6x
      x = 5
      Найдем y: 
      y = 4 + 5 = 9
      
    • Поскольку имеем утверждение, что A >= y и в задании требуется найти наименьшее A, то получаем:
    • y = 9:
      A >= 9 => наименьшее A = 9
      

    ✎ Решение 2 (программное):
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    for A in range(-100,100):
        OK = 1
        for x in range(0,100):
            for y in range(0,100):
                OK *= (y+5*x<=34)<=((y-x >4)or(y<=A)) 
        if OK:
            print( A )
            break

    PascalABC.NET:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
     
    begin
      for var A := -100 to 100 do
      begin
        var OK := true;
        for var x := 0 to 100 do
        begin
          for var y := 0 to 100 do
          begin
            OK := (y + 5 * x <= 34) <= ((y - x > 4) or (y <= A));
            if OK = false then break;
          end;
          if OK = false then break;
        end;
        if OK then 
        begin
          print(A);
          break;
        end;
      end;
    end.


    Поиск наибольшего и наименьшего числа A:

    15_13:

    Укажите наименьшее целое значение А при котором выражение
      
    (2y + 5x < A) ∨ (2x + 4y > 100) ∨ (3x – 2y > 70)

    истинно для любых целых положительных значений x и y.

    Типовые задания для тренировки

    Ответ: 171

    Показать решение:

      ✎ Решение (программное):
      Python:

      1
      2
      3
      4
      5
      6
      7
      8
      
      for A in range(-200,200):
          OK = 1
          for x in range(1,100):
              for y in range(1,100):
                  OK *= (2*y + 5*x < A) or (2*x + 4*y > 100) or (3*x - 2*y > 70) 
          if OK:
              print( A )
              break

      PascalABC.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      begin
        for var A := -200 to 200 do
        begin
          var OK := true;
          for var x := 1 to 100 do
          begin
            for var y := 1 to 100 do
            begin
              OK := (2*y + 5*x < A) or (2*x + 4*y > 100) or (3*x - 2*y > 70);
              if OK = false then break;
            end;
            if OK = false then break;
          end;
          if OK then 
          begin
            print(A);
            break;
          end;
        end;
      end.

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Поиск наибольшего и наименьшего числа A:

    15_14:

    Укажите наибольшее целое значение А при котором выражение
      
    (3y – x > A) ∨ (2x + 3y < 30) ∨ (2y – x < –31)

    истинно для любых целых положительных значений x и y.

    Типовые задания для тренировки

    Ответ: -31

    Показать решение:

      ✎ Решение 1 (теоретическое):

    • Разделим выражение на две части: часть с неизвестным = 1, часть известная = 0:
    • (3y – x > A)(2x + 3y < 30) ∨ (2y – x < –31) = 1
    • Выпишем отдельно обе скобки известной части:
    • (1) 
      (2x + 3y) >= 30,
      y >= (30 - 2x) / 3
      x = (30 - 3y) /2
      (2) 
      (2y – x >=–31)
      y >= (x - 31) / 2
      x = 2y + 31
      
    • Подберем значения координат для x и y обеих частей, и отобразим линии на графике функций:
    • (1)
      x | y
      0 | 10
      15| 0
      (2)
      x | y
      0 | -15 ( целые)
      30|0
    • Для первого уравнения:
    • Для второго уравнения:
    • Сопоставим обе области:
    • Добавим на график прямую A<3y-x:
    • Раз A < 3y – x, то будем перемещать А снизу вверх. Наибольшее значение А будет достигнуто в указанной точке пересечения с прямой (2).
    • Т.е. для уравнения (2) имеем:
    • если y = 1, то x = 2*1 + 31 = 33
    • Подставим в выражение для поиска А:
    • А < 3y - x
      A < 3-33, A < -30, A=-31

      ✎ Решение 2 (программное):
      Python:

      1
      2
      3
      4
      5
      6
      7
      8
      
      for A in range(200,-200,-1):
          OK = 1
          for x in range(1,100):
              for y in range(1,100):
                  OK *= (3*y-x>A) or (2*x+3*y<30) or (2*y-x<-31) 
          if OK:
              print(A)
              break

    📹 Видео
    📹 Видеорешение на RuTube здесь

    Информатика ЕГЭ 14 задание разбор

    14-е задание: «Операции в системах счисления»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 5 минут.
      
    Проверяемые элементы содержания: Знание позиционных систем счисления
    До ЕГЭ 2021 года — это было задание № 16 ЕГЭ

    Плейлист видеоразборов задания на YouTube:
    Задание демонстрационного варианта 2022 года ФИПИ


    Определите наибольшее/наименьшее значение x, y

    14_14:

    Операнды арифметического выражения записаны в системе счисления с основанием 15.

    82x19₁₅ – 6x073₁₅

    В записи чисел переменной x обозначена неизвестная цифра из алфавита 15-ричной системы счисления. Определите наименьшее значение x, при котором значение данного арифметического выражения кратно 11. Для найденного значения x вычислите частное от деления значения арифметического выражения на 11 и укажите его в ответе в десятичной системе счисления. Основание системы счисления в ответе указывать не нужно.

    Ответ: 7806

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    uses school;
    begin
      foreach var x in '0123456789abcde' do
      begin
        var a := dec('82'+ x +'19', 15);
        var b :=dec('6' + x +'073', 15);
        var sum := a - b;
        if sum mod 11 = 0 then
        begin
          print(sum / 11);
          break;
        end
      end;
    end.
    Python:

    1
    
     
    С++:

    1
    
     

    Сколько цифр и сумма цифр

    14_12:

    Значение арифметического выражения

    43∙7103 – 21∙757 + 98

    записали в системе счисления с основанием 7.
    Найдите сумму цифр получившегося числа и запишите её в ответе в десятичной системе счисления.

    Ответ: 276

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net, Решение 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    begin
      var x,s: Biginteger;
      x := 43*Biginteger.Pow(7, 103) - 21*Biginteger.Pow(7, 57) + 98;
      // в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
      s:=0;
      while x > 0 do
      begin
        s:=s+ x mod 7; // добавляем цифру правого разряда
        x := x div 7; // убираем разряд числа в 7-й системе сч.
      end;
      println(s);
    end.
    PascalABC.net, Решение 2:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    uses school;
     
    begin
      var n: bigInteger;
      n := 43 * Biginteger.Pow(7, 103) - 21 * Biginteger.Pow(7, 57) + 98;
      print(n.ToString.ToBase(7).CountOf('1') +
        n.ToString.ToBase(7).CountOf('2') * 2 + 
        n.ToString.ToBase(7).CountOf('3') * 3 +
        n.ToString.ToBase(7).CountOf('4') * 4 +
        n.ToString.ToBase(7).CountOf('5') * 5 +
        n.ToString.ToBase(7).CountOf('6') * 6);
    end.
    Python:

    1
    2
    3
    4
    5
    6
    7
    
    x = 43*7**103 - 21*7**57 + 98
    s = 0
    # в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
    while x: 
        s+= x % 7 # добавляем цифру к сумматору
        x //= 7 # убираем разряд числа в 7-й системе сч.
    print( s )
    С++:

    1
    
     

    14_1:

    Значение арифметического выражения:
    21024 + 464 — 64
    записали в системе счисления с основанием 2.

    Сколько цифр «1» содержится в этой записи?
      
    Типовые задания для тренировки
    Типовые задания для тренировки

    Ответ: 123

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net, Решение 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    begin
      var k := 0;
      var x: Biginteger;
      x := Biginteger.Pow(2, 1024) + Biginteger.Pow(4, 64) - 64;
      // в получившемся числе рассматриваем каждую цифру в 2-й системе сч.
      while x > 0 do
      begin
        if x mod 2 = 1 then k += 1; // если цифра = 1, то считаем ее
        x := x div 2; // убираем разряд числа в 2-й системе сч.
      end;
      println(k);
    end.
    PascalABC.net, Решение 2:

    1
    2
    3
    4
    5
    6
    7
    
    uses school;
     
    begin
      var x: bigInteger;
      x := Biginteger.Pow(2, 1024) + Biginteger.Pow(4, 64) - 64;
      print(x.ToString.ToBase(2).CountOf('1'));
    end.
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    x = 2**1024 + 4**64 - 64
    k = 0
    # в получившемся числе рассматриваем каждую цифру в 2-й системе сч.
    while x: 
        if x % 2 == 1: # если цифра = 1, то считаем ее
            k += 1
        x //= 2 # убираем разряд числа в 2-й системе сч.
    print( k )
    С++:

    1
    
     

    ✎ Решение теоретическое:

    • Существует правило:
    • 2N = 10..02(1 единица и N нулей)
    • Чтобы воспользоваться этим правилом, преобразуем общее выражение к степеням двойки:
    • 21024 + (22)64 - 26 = 21024 + 2128 - 26
    • При переводе в двоичную систему получим:
    • 10...0 (1024 нуля) + 10...0 (128 нулей) - 10...0 (6 нулей)
    • Обратим внимание, что разница между числами большая. Т.е. при выполнении сложения в столбик, единицы в одном и том же разряде быть не могут. Так:
    •  10....00000  - 1024 нуля
      +
             10..0  - 128 нулей
      _________________________
       10....10..0  
      
    • Из первого слагаемого 10…0 (1024 нуля) запомним одну единицу в старшем бите, остальные нули нас не интересуют, так как далее мы воспользуемся другим правилом — для разницы:
    •  10....00000  - 1024 нуля
      +
             10..0  - 128 нулей
      _________________________
       10....10..0  - запомним единицу
      
    • Существует также правило:
    • 2N — 2K = 1…1 (N - K единиц)0…0(K нулей)
    • По формуле выполним вычитание 2128 — 26: получим 1..1 (122 единицы) 0..0(6 нулей):
    •  10..0000000  - 128 нулей
      -
           1000000  
      _________________________
       11..1000000  - 122 единицы и 6 нулей
      
    • Прибавим к 122 получившимся единицам еще одну из первого слагаемого (10…0 (1024 нуля)) и получим:
    • 122 + 1 = 123 единицы

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    14 задание. Демоверсия ЕГЭ 2018 информатика:

    Значение арифметического выражения:
    4910 + 730 – 49
    записали в системе счисления с основанием 7.

    Сколько цифр «6» содержится в этой записи?

    Типовые задания для тренировки

    Ответ: 18

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net, решение 1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    begin
      var x: Biginteger;
      x := Biginteger.Pow(49, 10) + Biginteger.Pow(7, 30) - 49;
      // в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
      var k:=0;
      while x > 0 do
      begin
        if x mod 7 = 6 then k+=1; // если цифра = 6, то считаем ее
        x := x div 7; // убираем разряд числа в 7-й системе сч.
      end;
      println(k);
    end.
    PascalABC.net, решение 2:

    1
    2
    3
    4
    5
    6
    7
    
    uses school;
     
    begin
      var x: bigInteger;
      x := Biginteger.Pow(49, 10) + Biginteger.Pow(7, 30) - 49;
      print(x.ToString.ToBase(7).CountOf('6'));
    end.
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    x = 49**10 + 7**30 - 49
    k = 0
    # в получившемся числе рассматриваем каждую цифру в 7-й системе сч.
    while x: 
        if x % 7 == 6: # если цифра = 6, то считаем ее
            k += 1
        x //= 7 # убираем разряд числа в 7-й системе сч.
    print( k )
    С++:

    1
    
     

    ✎ Решение теоретическое:

    • Приведем все числа к степеням 7:
    • 720 + 730 - 72
    • Расставим операнды выражения в порядке убывания степеней:
    • 730 + 720 - 72
    • Вспомним две формулы для работы со системами счисления:
    • 1.
      an = 10..0a
             n
      2.
      an - am = (a-1)..(a-1)0..0a
                    n-m       m
      
    • Переведем первое число согласно формуле 1:
    • 730 = 10..0
              30
      
    • В данном числе нет цифры 6, как и в остальных числах.
    • Цифра 6 появляется при выполнении вычитания.
    • Подсчитаем все «6», используя формулу 2:
    • 0 + (20 - 2) = 18
      
    • Получаем шестерок: 18

    Результат: 18

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    14_2:

    Значение арифметического выражения:
    4500 + 3*42500 + 16500 — 1024
    записали в системе счисления с основанием 4.

    Сколько цифр «3» содержится в этой записи?

    Типовые задания для тренировки

    Ответ: 496

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net:

    1
    2
    3
    4
    5
    6
    7
    
    uses school;
     
    begin
      var x: bigInteger;
      x := Biginteger.Pow(4,500) + 3*Biginteger.Pow(4,2500) + Biginteger.Pow(16,500) - 1024;
      print(x.ToString.ToBase(4).CountOf('3'));
    end.
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    x = 4**500 + 3*4**2500 + 16**500 - 1024
    k = 0
    # в получившемся числе рассматриваем каждую цифру в 4-й системе сч.
    while x: 
        if x % 4 == 3: # если цифра = 3, то считаем ее
            k += 1
        x //= 4 # убираем разряд числа в 4-й системе сч.
    print( k )
    С++:

    1
    
     

    Результат: 496

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    14_5:

    Значение арифметического выражения: 81024 + 832 – 65 – записали в системе счисления с основанием 8. Сколько цифр «7» содержится в этой записи?

    Типовые задания для тренировки

    Ответ: 31

    Показать решение:

    ✎ Решение с использованием программирования:

    PascalABC.net:

    1
    2
    3
    4
    5
    6
    7
    
    uses school;
     
    begin
      var x: bigInteger;
      x := Biginteger.Pow(8,1024) + Biginteger.Pow(8,32) - 65;
      print(x.ToString.ToBase(8).CountOf('7'));
    end.
    Python:

    1
    2
    3
    4
    5
    6
    7
    8
    
    x = 8**1024 + 8**32 - 65
    k = 0
    # в получившемся числе рассматриваем каждую цифру в 8-й системе сч.
    while x: 
        if x % 8 == 7: # если цифра = 7, то считаем ее
            k += 1
        x //= 8 # убираем разряд числа в 8-й системе сч.
    print( k )
    С++:

    1
    
     

    ✎ Решение теоретическое:

    • Приведем все числа к степеням восьмерки:
    • 65 = 64 + 1 = 82 + 80;
    • Получаем:
    • 81024 + 832 - (82 + 80);
      81024 + 832 - 82 - 80
      
    • Вспомним две формулы для работы с системами счисления:
    • 1.
      an = 10..0a
             n
      2.
      an - am = (a-1)..(a-1)0..0a
                    n-m       m
      
    • Переведем первое число согласно формуле 1:
    • 81024 = 10..0
              1024
      
    • В данном числе нет цифры 7, как и в остальных числах.
    • Цифра 7 появляется при выполнении вычитания. У нас два таких действия, идущих подряд. Это неудобно. Необходимо, чтобы действия чередовались (a + b — c + d — e…)
    • Вспомним еще одну формулу:
    • 3.
      
      -2n = -2n+1 + 2n
      ! Формула предназначена для чисел в двоичной системе счисления, но для подсчета цифр "7" в 8-й (или "6" в 7-й и т.п.) ее можно использовать (для поиска единиц или нулей она не подходит!!!)
    • В нашем случае заменим часть выражения:
    • -82 = -83 + 82
      ! обратите внимание, что тождество неверно, но
      при поиске количества "7" этой формулой можно воспользоваться
      (для поиска единиц или нулей она не подходит!)
      
      
      Получаем:
      
      81024 + 832 - 83 + 82- 80
      
    • Получили чередование операций «+» и «-«.
    • Теперь посчитаем все «7», используя формулу 2:
    • 0 + (32 - 3) + (2 - 0) = 31
      
    • Получаем семерок: 31

    14_13:

    Сколько значащих нулей в двоичной записи числа 4350 + 8340 – 2320 – 12?

    Ответ: 324

    Показать решение:

      ✎ Решение с использованием программирования:

      PascalABC.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      begin
        var b2 := biginteger(2);
        var numb := (2 * b2) ** 350 + (4 * b2) ** 340 - (1 * b2) ** 320 - 12;
        var digit: biginteger;
        var n := 0;
        while numb > 0 do
        begin
          digit := numb mod 2;
          if digit = 0 then n += 1;
          numb := numb div 2
        end;
        print(n)
       end.
      PascalABC.net, решение 2:

      1
      2
      3
      4
      5
      6
      7
      
      uses school;
       
      begin
        var x: bigInteger;
        x := Biginteger.Pow(4,350) + Biginteger.Pow(8,340) - Biginteger.Pow(2,320) - 12;
        print(x.ToString.ToBase(2).CountOf('0'));
      end.
      Python:

      1
      2
      3
      4
      5
      6
      7
      
      x = 4**350 + 8**340 - 2**320 - 12
      print(x)
      k = 0
      while x:
        if x % 2 == 0: k += 1
        x //= 2
           print( k )
      С++:

       

    ✎ Решение теоретическое:
    4350 + 8340 – 2320 – 12

  • По возможности приведем каждое слагаемое к степеням 2. Получим:
  • (22)350 + (23)340 - 2320 - 3*22 =
    (22)350 + (23)340 - 2320 - 12 =
    2700 + 21020 - 2320 - (23 + 22)
    
  • Далее рассуждаем так: количество нулей можно найти, если из общего количества цифр в результирующем числе вычесть количество не нулей (любых других цифр).
  • Расположим операнды по убыванию:
  • 21020 + 2700 - 2320 - 23 - 22
  • Наибольшее число 21020, в нем 1021 разряд в двоичной с.с. (одна единица и 1020 нулей). То есть всего 1021 знаков.
  • Для того, чтобы избежать два подряд идущих минуса, воспользуемся правилом -2n = -2n+1+2n и преобразуем выражение:
  • 21020 + 2700 - 2321+ 2320- 24 + 23 - 22
  • Посчитаем количество не нулей в каждом операнде:
  • 21020 -> один не ноль
    2700 - 2321 -> 379 не нулей
    2320- 24 -> 316 не нулей 
    23 - 22 -> один не ноль
    Итого: 1+ 379+316 +1 = 697
  • Получаем нулей:
  • 1021 - 697 = 324

    Результат: 324


    Найти основание системы счисления и уравнения

    14_7:

    Укажите, сколько всего раз встречается цифра 2 в записи чисел 13, 14, 15, …, 23 в системе счисления с основанием 3.

    Типовые задания для тренировки

    Ответ: 13

    Показать решение:

    • Для начала достаточно перевести первое и последнее число предложенного интервала в троичную систему счисления. Сделаем это:
    • 1.
       13 | 3 
       12   4 | 3 
        1   3   1   
            1
      1310 = 1113
      
      2.
      23 | 3 
      21   7 | 3 
      2    6   2
           1
      2310 = 2123
      
    • Теперь добавим промежуточные числа в троичной системе счисления (прибавляя единицу к каждому очередному полученному числу), не забывая, что в троичной системе всего три цифры (0, 1 и 2):
    • 111, 112, 120, 121, 122, 200, 201, 202, 210, 211, 212
    • На всякий случай стоит посчитать количество полученных чисел и сравнить их с количеством чисел в исходной последовательности.
    • Теперь осталось посчитать количество цифр 2 в полученной последовательности. Их 13:
    • 111, 112, 120, 121, 122, 200, 201, 202, 210, 211, 212

    14_6:

    Решите уравнение:

    204N+1 = 204N + 2616

    В ответе укажите значение переменной N.

    Типовые задания для тренировки

    Ответ: 9

    Показать решение:

    • Разделим уравнение на три части и вычислим каждую часть отдельно (выделим части разным цветом):
    • 204N+1 = 204N + 2616
       1       2     3 
      
    • Используем формулу разложения числа по степеням основания:
    • 1. 
      210
      204N+1
      
      По формуле получаем:
      2*(N+1)2 + 0*(N+1)1 + 4*(N+1)0 =
      = 2*(N2 + 2N + 1) + 0 + 4 = 2N2 + 4N + 6
      
    • Выполним то же самое для остальных двух частей:
    • 2.
      210
      204N
      
      По формуле получаем:
      2*N2 + 0*N1 + 4*N0 =
      = 2N2 + 4
      
      3.
      2616 = 3810
      
    • Подставим результаты всех частей в уравнение:
    • 2N2 + 4N + 6 = 2N2 + 4 + 38;
      4N = 36;
      N = 9
      

    14_8:

    Найдите основание системы счисления, в которой выполнено сложение:

    144 + 24 = 201

    Типовые задания для тренировки

    Ответ: 7

    Показать решение:

    • Вместо обозначения искомой системы счисления введем неизвестное x:
    • 144x + 24x = 201x
    • Запишем формулу перевода в десятичную систему счисления каждого из слагаемых и сумму исходного равенства:
    • 144 + 24 = 201
      1*x2 + 4*x1 + 4*x0 + 2*x1 + 4*x0 = 2*x2 + 0*x1 + 1*x0
      
    • Упростим полученное уравнение:
    • x2 - 6x - 7 = 0
    • Решим уравнение:
    • D = b2 - 4ac = 36 - 4*1*(-7) = 64
      x = (-b ± √D)/2a
      x1 = (6 + 8)/2 = 7
      x2 = (6 - 8)/2 - не подходит
      x = 7
      

    14_9:

    В некоторой системе счисления записи десятичных чисел 68 и 94 заканчиваются на 3. Определите основание системы счисления.

    Типовые задания для тренировки

    Ответ: 13

    Показать решение:

    • Вспомним правило:
    • Последняя цифра записи числа в системе счисления с основанием X — это остаток от деления этого числа на X
    • Примем искомую систему счисления за x. Тогда, исходя из приведенного правила имеем:
    • 94 / x = некоторое число и остаток 3
      и
      68 / x = некоторое число и остаток 3
      
    • Поскольку x должно быть целым числом, то следующее деление должно выполняться без остатка:
    • 91/x 
      65/x
    • Иными словами x — наибольший общий делитель чисел 91 и 65.
    • Найдем НОД, например, по алгоритму Евклида:
    • 91 - 65 = 26
      65 - 26 = 39
      39 - 26 = 13
      26 - 13 = 13 
      
    • Получаем результат 13.

    14_10:

    Некоторое число X из десятичной системы счисления перевели в системы счисления с основаниями 16, 8. Часть символов при записи утеряна. Позиции утерянных символов обозначены *:

    X = *516 = *0*8

    Сколько чисел соответствуют условию задачи?

    Типовые задания для тренировки

    Ответ: 3

    Показать решение:

    • Данные числа с утерянными символами переведем из 16-й и из 8-й системы счисления в двоичную. Перевод будем делать триадами и тетрадами, неизвестные позиции оставим пустыми:
    • 1. *516
          *   |    5  16
      
      * * * * | 0 1 0 1 2
      
      2. *0*8
        *  |  0  |  *  8
      * * *|0 0 0|* * * 2
      
    • Сопоставим известные и неизвестные биты в обеих получившихся масках:
    • * * 0 0 0 1 0 1
    • Неизвестными остались 7-й и 8-й бит. Они не могут быть одновременно нулями, так как для *0*8 тогда исчезнет старший разряд. Поэтому оставшиеся варианты будут такими:
    • 1. 01000101
      2. 10000101
      3. 11000101
    • Итого 3 варианта.

    📹 Видео (аналитическое решение
    📹 Видеорешение на RuTube здесь)


    14_4:

    Укажите через запятую в порядке возрастания все основания систем счисления, в которых запись числа 75 оканчивается на 13.

    Типовые задания для тренировки

    Ответ: 8,72

    Показать решение:

    • Так как 75 должно оканчиваться на 13, то имеем два общих случая:
    • 1. 7510 = 13N 
      2. 7510 = ...13N (число оканчивается на 13)
      
    • Рассмотрим подробно каждый случай.
    • 1 случай:

    • Остаток должен быть равен 3 (последнее число в неизвестной системе), а частное должно равняться 1 (предпоследнее число в неизвестной системе):
    •  75|N 
        N|1  отсюда имеем => 75 - N = 3; т.е. N = 72
        3
      
    • Таким образом, мы получили одно из искомых оснований (72).
    • 2 случай:

    • Искомое оканчивается на цифру 3, значит:
    •  75|N 
       72|y  отсюда имеем => 75 = Ny + 3, где N - целое, неотриц.
        3
      
    • и далее, частное от деления — 1 (предпоследнее число):
    •  75|N  
       72|  y |N   => y = Nz + 1, где z - целое, неотриц.
        3  y-1|z
             1
      
    • Получаем два равенства (систему уравнений):
    • 75 = Ny + 3
      y = Nz + 1
      
    • Подставим y из второго равенства в первое:
    • 75 = N (Nz + 1) + 3;
      75 = N2z + N + 3;
      75 = N2z + N
    • Выразим z:
    • z = (72 - N)/N2
    • Учитывая то, что z — целое неотрицательное число, то 72 — N должно быть кратно N2, т.е. в числителе не может быть простого числа.
    • Простое число 67 получается путем вычитания из 72 числа 5. Соответственно, 5 нам не подходит: N ≠ 5:
    • 72 - 5 / 52 = 67 / 25  не делится, - не подходит!
    • Еще одно простое число — 71 получится при вычитании 72 — 1. Единица не подходит, так как при переводе в конце числа никак не останется 13: N ≠ 1.
    • Раз в знаменателе N2, то отбросим все числа, квадрат которых больше 72: 9, 10, … и т.д. до бесконечности: N < 9
    • Раз в итоговом числе есть число 13, значит основание системы счисления больше 3 (т.е. цифра три присутствует в системах, начиная с 4-й): N >= 4
    • Проверим оставшиеся варианты — 4, 6, 7, 8:
    •  75 | 4 
       72 | 18| 4 
        3   16| 2
             2  => не подходит! должна быть единица
      
       75 | 6 
       72 | 12| 6 
        3   12| 1
             0  => не подходит! должна быть единица
      
       75 | 7 
       70 
        5 => не подходит! должна быть 3 
      
       75 | 8 
       72 | 9| 8 
        3   8| 1
             1  => подходит!
      

    📹 Видео (аналитический способ)
    📹 Видеорешение на RuTube здесь


    14_11:

    Выражение 25*325 записано в троичной системе счисления. Определите, сколько в этой записи цифр 0, 1 и 2.

    Ответ: «0»=26, «1»=2, «2»=1

    Показать решение:

      Рассмотрим каждый сомножитель отдельно.

    • Первый сомножитель:
    • 25 = 32
      
      Переведем в троичную систему счисления (делением на 3, переписываем остатки).
      Результат:
      3210 = 10123
      
    • Для рассмотрения второго сомножителя будем использовать правило:
    • Получим:
    • 325 = 10..0{25 нулей}3
    • Выполним произведение, но для простоты счета, представим, что нулей не 25, а только 3:
    •    1000 x
         1012 =
         ----
         2000
        1000
       0000
      1000
      -------
      1012000
      
    • В исходном числе было 3 нуля, стало 4. Значит если было 25 нулей, то станет 25 + 1 = 26.
    • Единиц = 2, двоек = 1.

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    Информатика ЕГЭ 13 задание разбор

    13-е задание: «Информационные модели»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 3 минуты.
      
    Проверяемые элементы содержания: Умение представлять и считывать данные в разных типах информационных моделей (схемы, карты, таблицы, графики и формулы)
    До ЕГЭ 2021 года — это было задание № 15 и № _ ЕГЭ

    Плейлист видеоразборов задания на YouTube:

    Задание демонстрационного варианта 2022 года ФИПИ


    13_1:

    На рисунке — схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, И, К, М. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой.

    Сколько существует различных путей, ведущих из города А в город М и проходящих через город Г?
    разбор 13 задания егэ информатика
      
    Типовые задачи для тренировки

    Ответ: 21

    Показать решение:

    • Удалим ребра, которые проходят «мимо» вершины Г или до которых от пункта А можно дойти, минуя вершину Г:
    • 1_1

    • Вершина В удалена, т.к. возможны только следующие траектории движения через этот пункт (которые НЕ проходят через пункт Г):
    • 1. А — Б — В — И — М
    • 2. А — Б — В — Е — И — М
    • 3. А — Б — В — Е — М
    • 4. А — Б — В — Е — К — М
    • Теперь посчитаем результаты по оставшимся вершинам:
    М = И + Е + К 
    -----
     И = Е 
       Е = Г + Ж 
        Г = Б + А + Д = 1 + 1 + 1 = 3 
        Ж = Г = 3
     К = Е + Ж
    
    Теперь возвращаемся, подставляя найденные значения: ↑
       Е = Г + Ж = 3 + 3 = 6 
        Ж = Г = 3
     И = Е = 6 (получили из последующих шагов)
     К = Е + Ж = 6 + 3 = 9       
    М = И + Е + К = 6 + 6 + 9 = 21  
    

    📹 Видео (аналитическое решение)
    📹 Видеорешение на RuTube здесь


    13_2:

    На рисунке — схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, И, К, М. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой.

    Сколько существует различных путей, ведущих из города А в город М и не проходящих через город Г?
    решение ЕГЭ по информатике 2017 задание 15

    Ответ: 7

    Показать решение:

    • Удалим ребра, которые проходят через вершину Г:
    • решение 13 задания егэ

    • Теперь посчитаем результаты по оставшимся вершинам:
    М = И + Е + К
    -----
    И = В + Е
      В = 1
      Е = В + Ж
         Ж = 1
    
    Теперь возвращаемся, подставляя найденные значения: ↑
      Е = В + Ж = 1 + 1 = 2
    И = В + Е = 1 + 2 = 3 
    К = Е = 2 
    М = И + Е + К = 3 + 2 + 2 = 7  
    

    📹 Видео
    📹 Видеорешение на RuTube здесь


    13 задание. Демоверсия ЕГЭ 2018 информатика:

    На рисунке представлена схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, З, И, К, Л, М.
    По каждой дороге можно двигаться только в одном направлении, указанном стрелкой.

    Сколько существует различных путей из города А в город М, проходящих через город Ж?
    демоверсия егэ информатика 2018 решение 13 (15) задания

    Ответ: 20

    Показать решение:

    Результат: 20

    📹 Видео
    📹 Видеорешение на RuTube здесь


    13_4:

    На рисунке представлена схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, З, И, К, Л, М. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой.
    Какова длина самого длинного пути из города А в город М?
    Длиной пути считать количество дорог, составляющих этот путь.

    Ответ: 9

    Показать решение:

    Результат: 9

    Информатика ЕГЭ 12 задание разбор

    12-е задание: «Алгоритмы с циклами и условиями»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 4 минуты.
      
    Проверяемые элементы содержания: Умение анализировать результат исполнения алгоритма
    До ЕГЭ 2021 года — это было задание № 14 ЕГЭ

    Плейлист видеоразборов задания на YouTube:


    Задание демонстрационного варианта 2022 года ФИПИ

    Исполнитель Редактор и цепочки символов

    Учимся по видео (решения разного типа программным способом):

    📹 YouTube здесь

    Какая строка получится?

    12_4:
    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

    А) заменить (v, w)
    Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

    Б) нашлось (v)
    Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка при этом не изменяется.

    Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 40 идущих подряд цифр 123? В ответе запишите полученную строку.

    НАЧАЛО
    ПОКА нашлось (12) ИЛИ нашлось (333)
      ЕСЛИ нашлось (12)
        ТО заменить (12, 3)
        ИНАЧЕ заменить (333, 3)
      КОНЕЦ ЕСЛИ
    КОНЕЦ ПОКА
    КОНЕЦ
    

    Ответ: 33
    📹 Видео (Теоретическое)

    Показать решение:

    ✎ Решение 1. Теоретическое:

    • Рассмотрим алгоритм: редактор будет выполнять команды только тогда, когда в строке встречается цепочка «12» или цепочка «333»;
    • если в строке есть «12», то тогда эта цепочка заменяется на «3»;
    • если в строке нет цепочки «12», но есть «333», то цепочка «333» заменяется на «3».
    • Теперь вернемся к условию нашей задачи. Условие цикла истинно, соответственно выполняем блок ЕСЛИ, т.е. делаем замену: в каждом из 40 чисел ‘123‘, заменяем 12 на 3. Получим 40 + 40 = 80 троек (40 троек было изначально и 40 добавилось);
    • 123123123...123
      ↓  ↓  ↓     ↓
      3 33 33 3...3 3
      
    • Так как больше чисел 12 у нас не встречается, то работает блок ИНАЧЕ. Сколько раз можно заменить в 80 подряд идущих тройках три тройки на одну? 80 делим на 3 получаем 26 раз + 2 тройки в остатке. Итого осталось 28 троек;
    • 333 333 333 333... 333 33
         26 троек по три
      получили:
      3   3   3   3  ... 3 33
               26          + 2
      
    • Теперь из 28 троек сколько раз мы можем заменить три тройки на одну? 28 делим на 3 и получаем 9 раз + 1 тройка в остатке. Итого 10 троек;
    • 333 333 333 333... 333 3
         9 троек по три   + 1
      получили:
      3   3   3   3  ... 3 3
               9          + 1
      
    • Делаем то же самое: 10 делим на 3 получаем 3 раза + 1 тройка в остатке = 4 тройки
    • 333 333 333 3
      3 тройки по три + 1
      получили:
      3   3   3   3
      
    • Последний раз делим 4 на 3, получаем 1 тройку + 1 = 2 тройки
    • 3 3 3 3
        ↓
        3   3 
      

    Результат: 33
      
    ✎ Решение 2. Программное:
    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    begin
      var s := '123' * 40;
      while ('12' in s) or ('333' in s) do
      begin
        if '12' in s then
          s := s.Replace('12', '3', 1)
          else
          s := s.Replace('333', '3', 1);
      end; 
      print(s);
    end.
    Pascal (традиционный):

    begin
       var s := '123'*40;
       var p1 := Pos('12',s);
       var p2 := Pos('333',s);
       while (p1 > 0) or (p2 > 0) do begin
         if p1 > 0 then begin
           Delete( s, p1, 2 );
           Insert( '3', s, p1 );
         end
         else begin
           Delete( s, p2, 3 );
           Insert( '3', s, p2 );
         end;
         p1 := Pos('12',s);
         p2 := Pos('333',s);
       end; 
       write(s);
    end.
    Python:

    s = 40*'123'
    while "12" in s or "333" in s:
      if "12" in s:
        s = s.replace( "12", "3", 1 )
      else:
        s = s.replace( "333", "3", 1 )
    print(s)
    С++:

    #include<iostream>
    using namespace std;
    int main()
    {
       string s(40, '123'); 
       cout << s << endl;
       int p1 = s.find("12");
       int p2 = s.find("333");
       while( p1 != string::npos or p2 != string::npos ) {
          if( p1 != string::npos ) 
            s.replace( p1, 12, "3" );  
          else 
            s.replace( p2, 333, "3" );  
          p1 = s.find("12");
          p2 = s.find("333");
          cout << s << endl;
          }
       cout << s;
    }

    12_5:
    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

    А) заменить (v, w)
    Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

    Б) нашлось (v)
    Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка при этом не изменяется.

    Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 71 идущих подряд четверок цифр 1122? В ответе запишите полученную строку.

    НАЧАЛО
    ПОКА нашлось (12) ИЛИ нашлось (222)
      ЕСЛИ нашлось (12)
        ТО заменить (12, 2)
        ИНАЧЕ заменить (222, 2)
      КОНЕЦ ЕСЛИ
    КОНЕЦ ПОКА
    КОНЕЦ
    

    Ответ: 22

    Показать решение:

    ✎ Решение 1. Теоретическое:

    • Для удобства решения сначала сократим исходную цепочку до одной группы цифр:
    • 1122
    • Условие цикла истинно (ПОКА нашлось (12)), и условие в цикле истинно (ЕСЛИ нашлось (12)), значит, делаем замену: в первой группе цифр «1122«, заменяем 12 на 2:
    • 1122 => 122
    • Затем опять возвращаемся к условию цикла: условие цикла истинно (ПОКА нашлось (12)), и условие в цикле истинно (ЕСЛИ нашлось (12)), делаем опять замену: в первой группе цифр «122«, заменяем 12 на 2:
    • 122 => 22
    • Таким образом, получаем, что за две итерации цикла (2 шага), одна группа цифр превращается в две двойки.
    • Поскольку по условию имеем 71 группу цифр, то, чтобы узнать сколько двоек мы получим в результате выполнения условия ЕСЛИ нашлось (12), нам необходимо 71 умножить на 2 (кол-во двоек, получаемых из одной группы цифр):
    • 71 * 2 = 142 двойки из 71 группы 
      
    • То есть в итоге работы цикла и условия ЕСЛИ нашлось (12) мы получили всего 142 двоек.
    • Теперь работает условие ИНАЧЕ заменить (222, 2). Из 142 двоек каждые три заменяем на одну. Чтобы рассчитать итоговое количество двоек, необходимо 142 разделить на 3 (т.е. сколько раз можно заменять тройки двоек на одну двойку). Делить необходимо до тех пор, пока работает условие ИНАЧЕ заменить (222, 2):
    • 142 / 3 = 47 двоек + 1 двойка (остаток) = 48 двоек
      
    • 48 / 3 = 16 двоек
    • 16 / 3 = 5 двоек + 1 двойка (остаток) = 6 двоек
    • 6 / 3 = 2 двойки
    • В итоге осталось 2 двойки.

    ✎ Решение 2. Программное:
    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    begin
      var s := '1122' * 71;
      while ('12' in s) or ('222' in s) do
      begin
        if '12' in s then
          s := s.Replace('12', '2', 1)
          else
          s := s.Replace('222', '2', 1);
      end; 
      print(s);
    end.
    Pascal (традиционный):

    begin
       var s := '1122'*71;
       var p1 := Pos('12',s);
       var p2 := Pos('222',s);
       while (p1 > 0) or (p2 > 0) do begin
         if p1 > 0 then begin
           Delete( s, p1, 2 );
           Insert( '2', s, p1 );
         end
         else begin
           Delete( s, p2, 3 );
           Insert( '2', s, p2 );
         end;
         p1 := Pos('12',s);
         p2 := Pos('222',s);
       end; 
       write(s);
    end.
    Python:

    s = 71*'1122'
    while "12" in s or "222" in s:
      if "12" in s:
        s = s.replace( "12", "2", 1 )
      else:
        s = s.replace( "222", "2", 1 )
    print(s)
    С++:

    #include<iostream>
    using namespace std;
    int main()
    {
       string s(71, '1122'); 
       cout << s << endl;
       int p1 = s.find("12");
       int p2 = s.find("222");
       while( p1 != string::npos or p2 != string::npos ) {
          if( p1 != string::npos ) 
            s.replace( p1, 12, "2" );  
          else 
            s.replace( p2, 222, "2" );  
          p1 = s.find("12");
          p2 = s.find("222");
          cout << s << endl;
          }
       cout << s;
    }

    12_6:
    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

    А) заменить (v, w)
    Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

    Б) нашлось (v)
    Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка при этом не изменяется.

    Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 200 идущих подряд цифр 7? В ответе запишите полученную строку.

    НАЧАЛО
    ПОКА нашлось (99) ИЛИ нашлось (777)
      ЕСЛИ нашлось (777)
        ТО заменить (777, 9)
        ИНАЧЕ заменить (99, 7)
      КОНЕЦ ЕСЛИ
    КОНЕЦ ПОКА
    КОНЕЦ
    

      
    Типовые задачи для тренировки

    Ответ: 977
    📹 Видео (Теоретическое)

    Показать решение:

    • Рассмотрим алгоритм: редактор будет выполнять команды только тогда, когда в строке встречается цепочка «99» или цепочка «777»;
    • если в строке есть «777», то тогда эта цепочка заменяется на «9»;
    • если в строке нет цепочки «777», но есть «99», то цепочка «99» заменяется на «7».
    • Теперь вернемся к условию нашей задачи. Условие цикла истинно, условие ЕСЛИ нашлось 777 тоже истинно, делаем замену:
    • сколько раз можно заменить в 200 семерках три семерки на одну девятку? 200 делим на 3 получаем 66 замен, т.е. 66 цифр «9» + 2 семерки в остатке;
    • 777 777 ... 777 77
      получили:
      9...9   7766
      
    • После выполнения этих преобразований условие ЕСЛИ нашлось 777 ложно. Значит, выполняется блок ИНАЧЕ: Заменить 99 на 7:
    • [66 цифр «9»] + «77» -> «7» + [64 цифры «9»] + «77»:
    •     66 цифр
      99 999...999 77
       ↓
       7  999...999 77
           64 цифры
      
    • «7» + [64 цифры «9»] + «77» -> «7» + «7» + [62 цифры «9»] + «77»:
    •     64 цифры
      799 999...999 77
       ↓
      77   999...999 77
             62 цифры
      
    • «77» + [62 цифры «9»] + «77» -> «7» + «77» + [60 цифр «9»] + «77»:
    •      62 цифры
      7799 999...999 77
        ↓
      777  999...999 77
              60 цифр
      
    • Затем условие ЕСЛИ нашлось 777 опять становится истинным. Выполняется команда Заменить 777 на 9:
    •       60 цифр
      777 999...999  77
       ↓
       9   999...999 77
            61 цифра
      
    • Вернулись к той же «картине», что и после первого пункта. За эти шаги произошли преобразования, заменившие 66 девяток на 61 девятку, т.е. количество цифр «9» уменьшилось на 5 раз, а две цифры «77» так и остались в конце общей цепочки.
    • Чтобы рассчитать итоговое количество цифр «9», необходимо понять, сколько раз можно вычитать из 61 по 5 девяток:
    • 61 : 5 = 12 раз 
      12 раз возможно отнять по 5 девяток и 1 девятка останется "в остатке" 
    • Таким образом, после выполнения алгоритма, остается одна цифра «9» (в остатке) и в конце так и останутся две семерки: 977.

    12_7:

    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

    А) заменить (v, w)
    Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

    Б) нашлось (v)
    Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка при этом не изменяется.

    Какая строка получится в результате применения приведённой ниже программы к строке, состоящей из 90 идущих подряд цифр 3 и в конце одной цифры 1? В ответе запишите полученную строку.

    НАЧАЛО
    ПОКА нашлось (331) ИЛИ нашлось (166)
      ЕСЛИ нашлось (331)
        ТО заменить (331, 16)
        ИНАЧЕ заменить (166, 31)
      КОНЕЦ ЕСЛИ
    КОНЕЦ ПОКА
    КОНЕЦ
    

    Ответ: 316
    📹 Видео (Теоретическое)

    Показать решение:

      ✎ Решение 1. Программное:
      Pascalabc.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      begin
        var s := '3' * 90 + '1';
        while ('331' in s) or ('166' in s) do
        begin
          if '331' in s then
            s := s.Replace('331', '16', 1)
            else
            s := s.Replace('166', '31', 1);
        end; 
        print(s);
      end.
      Pascal (традиционный):

      begin
         var s := '3'*90 + '1';
         var p1 := Pos('331',s);
         var p2 := Pos('166',s);
         while (p1 > 0) or (p2 > 0) do begin
           if p1 > 0 then begin
             Delete( s, p1, 3 );
             Insert( '16', s, p1 );
           end
           else begin
             Delete( s, p2, 3 );
             Insert( '31', s, p2 );
           end;
           p1 := Pos('331',s);
           p2 := Pos('166',s);
         end; 
         write(s);
      end.
      Python:

      s = 90*'3'+'1'
      while "331" in s or "166" in s:
        if "331" in s:
          s = s.replace( "331", "16", 1 )
        else:
          s = s.replace( "166", "31", 1 )
      print(s)
      С++:

      #include<iostream>
      using namespace std;
      int main()
      {
         string s(90, '3'); 
         s+='1';
         cout << s << endl;
         int p1 = s.find("331");
         int p2 = s.find("166");
         while( p1 != string::npos or p2 != string::npos ) {
            if( p1 != string::npos ) 
              s.replace( p1, 331, "16" );  
            else 
              s.replace( p2, 166, "31" );  
            p1 = s.find("331");
            p2 = s.find("166");
            cout << s << endl;
            }
         cout << s;
      }

    Сколько удалено?

    12_8:

    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

    А) заменить (v, w)
    Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

    Б) нашлось (v)
    Дана программа для исполнителя Редактор:

    ПОКА нашлось (555) ИЛИ нашлось (333)
      ЕСЛИ нашлось (333)
        ТО заменить (333, 5)
        ИНАЧЕ заменить (555, 3)
      КОНЕЦ ЕСЛИ 
    КОНЕЦ ПОКА 
    

    Дана строка, состоящая из 500 цифр 5. Сколько пятёрок было удалено за время обработки строки по этой программе?

    Ответ: 561

    Показать решение:

    ✎ Решение 1. Теоретическое:

    • Выполним несколько итераций цикла ПОКА. Когда мы получим ту же самую последовательность цифр пять, за исключением их количества — остановимся:
    • 5..5
      500шт 
      
      1: Работает блок ИНАЧЕ (555->3):
      35..5
       497шт
      
      2: Работает блок ИНАЧЕ (555->3):
      335..5
        494шт
      
      3: Работает блок ИНАЧЕ(555->3):
      3335..5
         491шт
      
      4: Работает блок ЕСЛИ (333->5):
      5..5
      492шт
      
    • Остановились, так как мы пришли к исходной последовательности цифр пять. Проанализируем действия программы за этот фрагмент выполнения: было удалено 9 пятерок и одна пятерка добавилась. Ключевой вывод: было удалено 9 пятерок.
    • Всего за выполнение этого фрагмента программы «ушло» 8 пятерок: 500 - 492 = 8. Посчитаем, сколько раз можно выполнить данный фрагмент:
    • 500 : 8 = 62 и 4 в остатке
      
    • Т.е. 62 раза выполняется данный фрагмент и 4 цифр 5 еще остается (остаток = 4). Поскольку за одно выполнение фрагмента было удалено 9 цифр 5, посчитаем, сколько удалится за 62 выполнения:
    • 62 * 9 = 558
      
    • 558 цифр 5 было удалено. Посмотрим выполнение программы над оставшимися 4 цифрами 5:
    • Работает блок ИНАЧЕ(555->3):
      5555 = 35
       
    • Итого получаем удаленных цифр 5:
    • 558 + 3 = 561
      

    ✎ Решение 2. Программное:
    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    begin
      var s := '5' * 500;
      var k := 0;
      while ('555' in s) or ('333' in s) do
      begin
        if '333' in s then
          s := s.Replace('333', '5', 1)
          else
        begin
          s := s.Replace('555', '3', 1);
          k += 3;
        end;
      end; 
      print(k);
    end.
    Pascal (традиционный):

    begin
       var k:= 0;
       var s := '5'*500 ;
       var p1 := Pos('555',s);
       var p2 := Pos('333',s);
       while (p1 > 0) or (p2 > 0) do begin
         if p2 > 0 then begin
           Delete( s, p2, 3 );
           Insert( '5', s, p2 );
         end
         else begin
           Delete( s, p1, 3 );
           Insert( '3', s, p1 );
           inc(k,3);
         end;
         p1 := Pos('555',s);
         p2 := Pos('333',s);
       end; 
       write(k);
    end.
    Python:

    s = 500*'5'
    k=0
    while "555" in s or "333" in s:
      if "333" in s:
        s = s.replace( "333", "5", 1 )
      else:
        s = s.replace( "555", "3", 1 )
        k+=3;
    print(k)
    С++:

    #include<iostream>
    using namespace std;
    int main()
    {
       string s(500, '5');
       int k = 0; 
       cout << s << endl;
       int p1 = s.find("555");
       int p2 = s.find("333");
       while( p1 != string::npos or p2 != string::npos ) {
          if( p2 != string::npos ) 
            s.replace( p2, 333, "5" );  
          else  
            {
            s.replace( p1, 555, "3" );  
            k+=2;
            }
          p1 = s.find("555");
          p2 = s.find("333");
          cout << s << endl;
          }
       cout << k;
    }

    📹 Видео (Теоретическое)


    Чему равна сумма цифр?

    12_13:

    Дана программа для исполнителя Редактор:

    ПОКА нашлось (555) ИЛИ нашлось (333)
      ЕСЛИ нашлось (555)
        ТО заменить (555, 3)
        ИНАЧЕ заменить (333, 5)
      КОНЕЦ ЕСЛИ 
    КОНЕЦ ПОКА 
    

    Дана строка, состоящая из 200 цифр 5. Чему равна сумма цифр строки, полученной после обработки по этой программе?

    Ответ: 16

    Показать решение:

      ✎ Решение 1. Программное:
      Pascalabc.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      begin
        var s := '5' * 200;
        while ('555' in s) or ('333' in s) do
        begin
          if '555' in s then
            s := s.Replace('555', '3', 1)
          else
            s := s.Replace('333', '5', 1)
        end;
        println(s);
        var sum := s.CountOf('5') * 5 + s.CountOf('3') * 3;
        print(sum)
      end.
      Pascal (традиционный):

      1
      
       
      Python:

      1
      
       
      С++:

      1
      
       

    12_9:

    На вход приведённой ниже программе поступает строка, начинающаяся с символа «>», а затем содержащая 10 цифр 1, 20 цифр 2 и 30 цифр 3, расположенных в произвольном порядке.
    Определите сумму числовых значений цифр строки, получившейся в результате выполнения программы.

    Так, например, если результат работы программы представлял бы собой строку, состоящую из 50 цифр 4, то верным ответом было бы число 200.
    НАЧАЛО
    ПОКА нашлось (>1) ИЛИ нашлось (>2) ИЛИ нашлось (>3)
     ЕСЛИ нашлось (>1)
       ТО заменить (>1, 22>)
     КОНЕЦ ЕСЛИ
     ЕСЛИ нашлось (>2)
       ТО заменить (>2, 2>)
     КОНЕЦ ЕСЛИ
     ЕСЛИ нашлось (>3)
       ТО заменить (>3, 1>)
     КОНЕЦ ЕСЛИ
    КОНЕЦ ПОКА
    КОНЕЦ 
    

    Ответ: 110

    📹 Видео (Теоретическое)

    Показать решение:

    ✎ Решение 1. Программное:
    Pascalabc.net:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    begin
      var s := '>' + '1' * 10 + '2' * 20 + '3' * 30;
      var k := 0;
      while ('>1' in s) or ('>2' in s) or ('>3' in s) do
      begin
        if '>1' in s then
          s := s.Replace('>1', '22>', 1);
        if '>2' in s then
          s := s.Replace('>2', '2>', 1);
        if '>3' in s then
          s := s.Replace('>3', '1>', 1);
      end; 
      var sum := s.CountOf('1') + s.CountOf('2') * 2 + s.CountOf('3') * 3;
      {или так:
       var sum: integer;
       for var i := 1 to s.Count do
       if (s[i]='1') or (s[i]='2') or(s[i]='3') then
          sum:=sum + StrToInt(s[i]);
      }
    print(sum)
    end.
    Pascal (традиционный):

    1
    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
    30
    31
    32
    33
    34
    35
    36
    
    begin
      var s := '>' + '1' * 10 + '2' * 20 + '3' * 30;
      var p1 := pos('>1', s);
      var p2 := pos('>2', s);
      var p3 := pos('>3', s);
      while (p1 <> 0) or (p2 <> 0) or (p3 <> 0) do
      begin
        if p1 <> 0 then
        begin
          delete(s, p1, 2);
          insert('22>', s, p1)
        end;
        if p2 <> 0 then
        begin
          delete(s, p2, 2);
          insert('2>', s, p2)
        end;
        if p3 <> 0 then
        begin
          delete(s, p3, 2);
          insert('1>', s, p3)
        end;
        p1 := pos('>1', s);
        p2 := pos('>2', s);
        p3 := pos('>3', s);
      end;
      println(s);
      var sum : integer;
      for var i := 1 to s.Count do
         sum := s.CountOf('1') + s.CountOf('2') * 2 + s.CountOf('3') * 3;
      {или так:
       if (s[i]='1') or (s[i]='2') or(s[i]='3') then
          sum:=sum + StrToInt(s[i]);
      }
      print(sum)
    end.
    Python:

    1
    
     
    С++:

    1
    
     

    Сколько цифр … в конечной строке?

    12_10:

    Дана программа для исполнителя Редактор:

    НАЧАЛО
     	   ПОКА нашлось (12) ИЛИ нашлось (1)
       	      ЕСЛИ нашлось (12)
        	          ТО заменить (12, 2221)
        	     ИНАЧЕ заменить (1,222222)
        	     КОНЕЦ ЕСЛИ
     	   КОНЕЦ ПОКА
    КОНЕЦ
    

    Какая строка получится в результате применения приведённой ниже программы к строке, состоящей одной единицы и 51 стоящих справа от неё цифр 2? В ответ, запишите, сколько цифр 2 будет в конечной строке.

    Ответ: 159

    Показать решение:

      ✎ Решение 1. Программное:
      PascalABC.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      begin
        var s := '1' + '2' * 51;
        while ('12' in s) or ('1' in s) do
        begin
          if '12' in s then
            s := s.Replace('12', '2221', 1)
          else
            s := s.Replace('1', '222222', 1);
        end; 
        print(s.CountOf('2'))
      end.
      Pascal (традиционный):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      begin
        var s := '1' + '2' * 51;
        var p1 := pos('12', s);
        var p2 := pos('1', s);
        while (p1 <> 0) or (p2 <> 0) do
        begin
          if p1 <> 0 then
          begin
            delete(s, p1, 2);
            insert('2221', s, p1)
          end
          else
          begin
            delete(s, p2, 1);
            insert('222222', s, p2)
          end;
          p1 := pos('12', s);
          p2 := pos('1', s);
        end;
        print(s.CountOf('2'))
      end.
      Python:

      1
      
       
      С++:

      1
      
       

    Сколько цифр … в исходной строке?

    12_14:

    Дана программа для Редактора:

    ПОКА нашлось(01) ИЛИ нашлось(02) ИЛИ нашлось(03)
      заменить(01, 30)
      заменить(02, 3103)
      заменить(03, 1201)
    КОНЕЦ ПОКА
    

    Известно, что исходная строка начиналась с нуля, а далее содержала только единицы, двойки и тройки. После выполнения данной программы получилась строка, содержащая 31 единицу, 24 двойки и 46 троек. Сколько троек было в исходной строке?

    Ответ: 17

    Показать решение:

      ✎ Решение 1. Программное:

      PascalABC.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      
      begin
        for var n1 := 1 to 50 do
          for var n2 := 1 to 50 do
            for var n3 := 1 to 50 do
            begin
              // зададим исходную строку
              var s := '0' + n1 * '1' + n2 * '2' + n3 * '3';
              // начинаем цикл перебора и замены
              while ('01' in s) or ('02' in s) or ('03' in s) do
              begin
                s := s.replace('01', '30', 1);
                s := s.replace('02', '3103', 1);
                s := s.replace('03', '1201', 1);
              end;
              // выведем результат, удовлетворяющий условию задачи (с - количество "3" в исходной строке)
              if (s.countOf('1') = 31) and (s.countOf('2') = 24) and (s.countOf('3') = 46) then
              begin
                print(n3);
                exit;
              end;
            end;
      end.
      Python:

      for n1 in range(50):
          for n2 in range(50):
            for n3 in range(50):
      # зададим исходную строку
               s = '0' + n1*'1' + n2*'2' + n3*'3'
      # начинаем цикл перебора и замены
               while ('01' in s) or ('02' in s) or ('03' in s):
                  s = s.replace('01','30',1)
                  s = s.replace('02','3103',1)
                  s = s.replace('03','1201',1)
      # выведем результат, удовлетворяющий условию задачи (с - количество "3" в исходной строке)
               if s.count('1') == 31 and s.count('2') == 24 and s.count('3') == 46:
                   print(n1)
                   exit()
      Pascal(2 способ, традиционный):

      1
      
       

    Укажите минимальную возможную длину входной строки

    12_11:

    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов.

    заменить (v, w) 
    нашлось (v)

    Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.

    Дана программа для Редактора:

    ПОКА нашлось (555) ИЛИ нашлось (888)
      заменить (555, 8)
      заменить (888, 55)
    КОНЕЦ ПОКА
    

    Известно, что начальная строка состоит более чем из 300 цифр 5 и не содержит других символов. В ходе работы алгоритма получилась строка, содержащая одну цифру 5 и одну цифру 8. Укажите минимальную возможную длину входной строки.

    Ответ: 305

    Показать решение:

      ✎ Решение 1. Программное:
      PascalABC.net:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      
      begin
        for var i := 301 to 1000 do
        begin
          var s := '5' * i;
          while ('555' in s) or ('888' in s) do
          begin
            s := s.Replace('555', '8', 1);
            s := s.Replace('888', '55', 1);
          end; 
          if (s.countOf('5') = 1) and (s.countOf('8') = 1) then
          begin
            print(i);
            break;
          end
        end;
      end.
      Pascal (традиционный):

      1
      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
      
      begin
        for var i := 301 to 1000 do
        begin
          var s := '5' * i;
          var p1 := pos('555', s);
          var p2 := pos('888', s);
          while (p1 <> 0) or (p2 <> 0) do
          begin
            if p1 <> 0 then
            begin
              delete(s, p1, 3);
              insert('8', s, p1);
            end;
            p2 := pos('888', s); // обязательно!
            if p2 <> 0 then
            begin
              delete(s, p2, 3);
              insert('55', s, p2);
            end;
            p1 := pos('555', s);
            p2 := pos('888', s);    
          end;
          if (s.countOf('5') = 1) and (s.countOf('8') = 1) then
          begin
            print(i);
            break;
          end
        end;
      end.
      Python:

      1
      
       
      С++:

      1
      
       

    Какое наибольшее / наименьшее количество … могло быть в исходной строке?

    12_12:

    Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки символов.

    заменить (v, w) 
    нашлось (v)

    Первая команда заменяет в строке первое слева вхождение цепочки v на цепочку w. Если цепочки v в строке нет, эта команда не изменяет строку. Вторая команда проверяет, встречается ли цепочка v в строке исполнителя Редактор.

    К исходной строке, содержащей не более 100 троек и не содержащей других символов, применили приведённую ниже программу:

    НАЧАЛО 
    ПОКА нашлось (333) 
      заменить (333, 4) 
      заменить (4444, 3) 
    КОНЕЦ ПОКА 
    КОНЕЦ 
    

    В результате получилась строка 43.
    Какое наибольшее количество троек могло быть в исходной строке?

    Ответ: 92

    Показать решение:

      ✎ Решение 1. Программное:

      PascalABC.net (1 способ):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      begin
        for var i := 1 to 100 do
        begin
          var s := '3' * i;
          while '333' in s do
          begin
            s := s.Replace('333', '4', 1);
            s := s.Replace('4444', '3', 1);
            if (s = '43') then
              print(i);
          end;
        end;
      end.

      Вывод:

      4 15 26 37 48 59 70 81 92
      Python:

      for i in range(1,100):
          s="3"*i
          while "333" in s:
              s=s.replace("333","4",1)
              s=s.replace("4444","3",1)
              if s=="43":
                  print(i)

      Вывод:

      4 15 26 37 48 59 70 81 92
      Pascal(2 способ, традиционный):

      1
      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
      
      begin
        for var i := 1 to 100 do
        begin
          var s:= '3' * i;
          var p1 := pos('333', s);
          var p2 := pos('4444', s);
          while p1 <> 0 do
          begin
            if p1 <> 0 then
            begin
              delete(s, p1, 3);
              insert('4', s, p1);
            end;
            p2 := pos('4444', s); // обязательно!  
            if p2 <> 0 then
            begin
              delete(s, p2, 4);
              insert('3', s, p2);
            end;
            p1 := pos('333', s);
            p2 := pos('4444', s);   
            if (s = '43') then
              begin
                 print(i);
              end 
          end;
        end;
      end.

    Решение заданий прошлых лет (до 2021)

    Исполнитель Робот

    12_1:

    Система команд исполнителя РОБОТ, «живущего» в прямоугольном лабиринте на клетчатой плоскости, включает 4 команды-приказа и 4 команды проверки условия.
    Команды-приказы:

    вверх   вниз   влево   вправо

    Другие четыре команды проверяют истинность условия отсутствия стены у каждой стороны той клетки, где находится РОБОТ:

    сверху свободно    
    снизу свободно    
    слева свободно    
    справа свободно

    Сколько клеток приведенного лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?

    НАЧАЛО
    ПОКА < снизу свободно ИЛИ справа свободно >
      ЕСЛИ < справа свободно > ТО вправо КОНЕЦ ЕСЛИ
      ПОКА < снизу свободно > вниз КОНЕЦ ПОКА
    КОНЕЦ ПОКА
    КОНЕЦ
    

    егэ 2018 информатика тренажер

    Ответ: 21

    Показать решение:

    • Рассмотрим тело внешнего цикла и операторы, которые в нем находятся:
    • 1. В цикле выполняется проверка ЕСЛИ справа свободно ТО вправо: что означает движение на один шаг вправо (если это возможно)
    • 2. Затем располагается цикл с условием пока снизу свободно вниз: что означает движение до конца вниз (пока это возможно)
    • После чего внешний цикл повторяется.
    • Таким образом, отметим «тупиковые» клетки, т.е. те, которые не позволят двигаться роботу к цели:
    • A5, A6, B1, B2, B6, C1, C2, D1, D2, D3, D4, D5, E3, E4, E5
    • Таких клеток получилось 15. Вычислим подходящие клетки (всего клеток 36):
    • 36 - 15 = 21

    12_2:

    Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, РОБОТ уцелеет и остановится в закрашенной клетке (клетка F6)?

    НАЧАЛО
    ПОКА < справа свободно ИЛИ снизу свободно >
      ПОКА < снизу свободно >
        вниз
      КОНЕЦ ПОКА
      ПОКА < справа свободно >
        вправо
      КОНЕЦ ПОКА
    КОНЕЦ ПОКА
    КОНЕЦ
    

    решение 12 задания егэ, робот

    Ответ: 19

    Показать решение:

    Результат: 19

    📹 Видео


    Исполнитель Чертежник

    12 задание. Демоверсия ЕГЭ 2018 информатика:

    Исполнитель Чертёжник перемещается на координатной плоскости, оставляя след в виде линии. Чертёжник может выполнять команду сместиться на (a, b), где a, b – целые числа. Эта команда перемещает Чертёжника из точки с координатами (x,y) в точку с координатами (x + a, y + b).

    Например, если Чертёжник находится в точке с координатами (4, 2), то команда сместиться на (2, −3) переместит Чертёжника в точку (6, −1).
     
    Цикл

    ПОВТОРИ число РАЗ
    последовательность команд
    КОНЕЦ ПОВТОРИ

    означает, что последовательность команд будет выполнена указанное число раз (число должно быть натуральным).

    Чертёжнику был дан для исполнения следующий алгоритм (число повторений и величины смещения в первой из повторяемых команд неизвестны):

    НАЧАЛО
    сместиться на (4, 6)
      ПОВТОРИ … РАЗ
        сместиться на (…, …)
        сместиться на (4, -6)
      КОНЕЦ ПОВТОРИ
    сместиться на (-28, -22)
    КОНЕЦ
    

    В результате выполнения этого алгоритма Чертёжник возвращается в исходную точку.
    Какое наибольшее число повторений могло быть указано в конструкции «ПОВТОРИ … РАЗ»?

    Подобные задания для тренировки

    Ответ: 8

    Показать решение:

    Результат: 8

    📹 Видео



    Информатика ЕГЭ 11 задание разбор

    11-е задание: «Информационный объем сообщения»
    Уровень сложности — повышенный,
    Требуется использование специализированного программного обеспечения — нет,
    Максимальный балл — 1,
    Примерное время выполнения — 3 минуты.
      
    Проверяемые элементы содержания: Умение подсчитывать информационный объём сообщения
    До ЕГЭ 2021 года — это было задание № 13 ЕГЭ

    Плейлист видеоразборов задания на YouTube:

    Задание демонстрационного варианта 2022 года ФИПИ


    Кодирование сообщений (работа с текстом)

    11_1:

    Объем сообщения – 7,5 Кбайт. Известно, что данное сообщение содержит 7680 символов. Какова мощность алфавита?
      
    Типовые задания для тренировки

    Ответ: 256

    Показать решение:

    • Воспользуемся формулой:
    • I = N * K
      I - объем сообщения
      N - количество символов 
      K - количество бит на 1 символ
    • В нашем случае N = 7680 символов, на которые выделено I = 7,5 Кбайт памяти. Найдем количество бит, необходимое для хранения одного символа (сначала переведя Кбайты в биты):
    • I = 7,5 Кбайт = 7,5 * 213 бит

      \[ K = \frac {7,5 * 2^{13}}{7680} = \frac {7,5 * 2^{13}}{15 * 2^9} = \frac {7,5 * 16}{15} = 8 \]

    • 8 бит на символ позволяют закодировать:
    • 28 = 256 различных символов
      (по формуле Q = 2N)

    • 256 символов — это и есть мощность

    📹 Видео
    📹 Видеорешение на RuTube здесь


    11_2:

    Мощность алфавита равна 256. Сколько Кбайт памяти потребуется для сохранения 160 страниц текста, содержащего в среднем 192 символа на каждой странице?
      
    Типовые задания для тренировки

    Ответ: 30

    Показать решение:

    • Найдем общее количество символов на всех страницах (для удобства будем использовать степени двойки):
    • 160 * 192 = 15 * 211
    • По формуле Q = 2n найдем количество бит, требуемое на хранение одного символа (в нашем случаем Q = 256):
    • 256 = 2n 
      -> n = 8 бит на 1 символ
    • Воспользуемся формулой I = N * K и найдем требуемый объем:
    • \[ I = {15 * 2^{11}} * 2^3 бит = \frac {15 * 2^{14}}{2^{13}} Кбайт = 30 Кбайт \]

      I = 30 Кбайт
      

    📹 Видео
    📹 Видеорешение на RuTube здесь


    11_3:

    Два текста содержат одинаковое количество символов. Первый текст составлен в алфавите мощностью 16 символов, а второй текст – в алфавите из 256 символов.
    Во сколько раз количество информации во втором тексте больше, чем в первом?

    Ответ: 2

    Показать решение:

    • Необходима формула Q = 2n
    • Вычислим требуемое количество бит на хранение одного символа для обоих текстов:
    • 1.  16 = 2n -> n = 4
      2.  256 = 2n -> n = 8
    • Найдем во сколько раз количество информации (объем) во втором тексте больше:
    • 8 / 4 = 2

    Работа с различными системами

    11_4:

    Кабельная сеть проводит голосование среди зрителей о том, какой из четырех фильмов они хотели бы посмотреть вечером. Кабельной сетью пользуются 2000 человек. В голосовании участвовало 1200 человек.
    Каков объем информации (в байтах), записанный автоматизированной системой голосования?

    Ответ: 300

    Показать решение:

    • Так как номера четырех фильмов хранятся в компьютерной системе, то можно найти количество бит, необходимое для хранения номера фильма:
    • Q = 2k   
      -> 4 = 2k 
      -> k = 2 бита
    • Так как все 1200 человек будут голосовать за один из фильмов, соответственно, на каждый голос нужно выделить такой же объем памяти (т.е. 2 бита).
    • Найдем количество бит, необходимое для хранения всех 1200 голосов:
    • 1200 * 2 = 2400 бит = 2400/8 байт = 300 байт

    📹 Видео
    📹 Видеорешение на RuTube здесь


    11_5:

    Репетиционный экзамен в школе сдают 105 человек. Каждому из них выделяют специальный номер, идентифицирующий его в автоматической системе проверки ответов. При регистрации участника для записи его номера система использует минимально возможное количество бит, одинаковое для каждого участника.

    Каков объем информации в битах, записанный устройством после регистрации 60 участников?

    Ответ: 420

    Показать решение:

    Результат: 420

    📹 Видео
    📹 Видеорешение на RuTube здесь


    11_6:

    В базе данных хранятся записи, содержащие информацию о датах. Каждая запись содержит три поля: год (число от 1 до 2100), номер месяца (число от 1 до 12) и номер дня в месяце (число от 1 до 31). Каждое поле записывается отдельно от других полей с помощью минимально возможного числа бит.
    Определите минимальное количество бит, необходимых для кодирования одной записи.

    Ответ: 21

    Показать решение:

    • Необходима формула Q = 2n.
    • Вычислим требуемое количество бит на хранение каждого пункта всей записи:
    • 1. 2100 вариантов: 2100 ~ 212 -> n = 12 бит
      2. 12 вариантов: 12 ~ 24 -> n = 4 бит
      3. 31 вариант: 31 ~ 25 -> n = 5 бит
      
    • Найдем общее количество бит для всей записи:
    • 12 + 4 + 5 = 21

    11_7:

    Репетиционный экзамен сдают 9 потоков по 100 человек в каждом. Каждому из них выделяют специальный код, состоящий из номера потока и номера в потоке. При кодировании этих номеров участников проверяющая система использует минимально возможное количество бит, одинаковое для каждого участника, отдельно для номера потока и номера в потоке. При этом для записи кода используется минимально возможное и одинаково целое количество байтов.
    Каков объем информации в байтах, записанный устройством после регистрации 80 участников?
    В ответе укажите только число.

    Ответ: 160

    Показать решение:

    • Код состоит из двух составляющих: 1. номер потока (в битах) и 2. номер по порядку (в битах). Найдем количество бит, необходимое для их хранения:
    • 1. N = 2i -> 9 = 2i -> i = 4 бит 
      (23 < 9 < 24) 
      
      2. N = 2i -> 100 = 2i -> i = 7 бит 
      (26 < 100 < 27) 
      
    • Итого получаем 4 + 7 = 11 бит на один код. Но на хранение кода по условию выделяется целое число байт. Значит переведем получившийся результат в байты:
    • 11/ 8 ~ 2 байта (одного байта недостаточно, 8 < 11) 
      
    • Так как нам необходимо получить объем информации после регистрации 80 участников, то вычисляем:
    • 2 * 80 = 160 байт

    📹 Видео


    Компьютерные системы и автомобильные номера

    11_8:

    Автомобильный номер состоит из нескольких букв (количество букв одинаковое во всех номерах), за которыми следуют три цифры. При этом используются 10 цифр и только 5 букв: Н, О, М, Е и Р. Нужно иметь не менее 100 тысяч различных номеров.
    Какое наименьшее количество букв должно быть в автомобильном номере?

    Ответ: 3

    Показать решение:

    • Необходима формула Q = mn.
    • Q - количество вариантов
      m - мощность алфавита
      n - длина
    • Составим правую часть формулы, исходя из данных условия задания (неизвестное количество букв (из пяти вариантов) и три цифры (из 10 вариантов)):
    • 5 ... 5 10 10 10 = 5x * 103 
      
    • Весь этот результат по условию должен быть не менее 100000. Подставим остальные данные в формулу:
    • 100000 <= 5x * 103 
      
    • Отсюда найдем наименьший подходящий x:
    • x = 3: 
      53 * 1000 = 125000 (125000 > 100000)
      

    📹 Видео


    11 (13) задание. Демоверсия ЕГЭ 2018 информатика:

    При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 10 символов. В качестве символов используют прописные буквы латинского алфавита, т.е. 26 различных символов. В базе данных для хранения каждого пароля отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование паролей, все символы кодируют одинаковым и минимально возможным количеством бит.

    Определите объём памяти (в байтах), необходимый для хранения данных о 50 пользователях.
    В ответе запишите только целое число – количество байт.

    Ответ: 350

    Показать решение:

    • Основной формулой для решения данной задачи является:
    • Q = 2N

      где Q - количество вариантов символов, которые можно закодировать с помощью N бит.

    • Чтобы найти количество бит, необходимое для хранения одного пароля, для начала нужно найти количество бит, необходимых для хранения 1 символа в пароле. По формуле получаем:
    • 26 = 2N 
      -> N ~ 5 бит
      
    • Пароль состоит из 10 символов. Значит на пароль необходимо выделить бит:
    • 10 * 5 = 50 бит всего на пароль
    • Поскольку сведения о пароле сохраняются в байтах, то переведем:
    • 50 бит / 8 ~ 7 байт 
      (берем ближайшее число большее 50 и кратное 8: 56/8 = 7)
      
    • Теперь найдем сколько байт отводится для хранения информации о 50 пользователях:
    • 7 байт * 50 (пользователей) = 350 байт

    📹 Видео


    11_10:

    В некоторой стране автомобильный номер состоит из 7 символов. Каждый символ может быть одной из 18 различных букв или десятичной цифрой.

    Каждый такой номер в компьютерной программе записывается минимально возможным и одинаковым целым количеством байт, при этом используют посимвольное кодирование и каждый символ кодируется одинаковым и минимально возможным количеством бит.

    Определите объем памяти в байтах, отводимый этой программой для записи 50 номеров.
    В ответе укажите только число.

    Ответ: 250

    Показать решение:

    • Так как в номере может быть использована либо одна буква из 18, либо одна цифра из 10, то всего в качестве одного символа в номере может быть использован один из 28 символов:
    • 18 + 10 = 28
      
    • Определим, сколько понадобится бит для хранения одного символа в номере, для этого используем формулу N = 2i:
    • 28 = 2i 
      => i = 5
      
    • Поскольку общее количество символов в номере равно 7, то получим необходимое количество бит на хранение одного номера:
    • I = 7 * 5 = 35 бит
      
    • Поскольку на хранение номера выделяется одинаковое количество байт, то переведем в байты:
    • 35 / 8 ~ 5 байт
      
    • В задаче спрашивается, сколько потребуется памяти для хранения 50 номеров. Находим:
    • I = 50 * 5 = 250 байт на хранение 50 номеров
      

    📹 Видео


    При регистрации в компьютерной системе каждому пользователю выдаётся идентификатор, состоящий из 10 символов, первый и последний из которых — одна из 18 букв, а остальные — цифры (допускается использование 10 десятичных цифр). Каждый такой идентификатор в компьютерной программе записывается минимально возможным и одинаковым целым количеством байт (при этом используют посимвольное кодирование; все цифры кодируются одинаковым и минимально возможным количеством бит, все буквы также кодируются одинаковым и минимально возможным количеством бит).
      
    Определите объём памяти, отводимый этой программой для записи 25 паролей. (Ответ дайте в байтах.)

    Ответ: 150

    Показать решение:

    • Идентификатор пароля по заданию состоит из букв и цифр, необходимо рассмотреть отдельно эти составляющие.
    • Поскольку в пароле может присутствовать 18 букв, то подсчитаем, сколько бит необходимо для хранения 1-й буквы:
    • С помощью n бит можно закодировать 2n различных вариантов, 
      Иначе говоря 18 = 2n, -> n = 5 бит (т.к. 4 мало, 24=16, 25 = 32) 
      
    • Теперь подсчитаем количество бит, необходимое для хранения одной цифры. По условию используется 10 цифр:
    • 10 = 2n, -> n = 4 бита (т.к. 3 мало, 23=8, 24 = 16) 
      
    • Так как по условию длина идентификатора 10 символов, первый и последний из которых — одна из 18 букв, а остальные — цифры, то получим:
    • В битах:
      5 4 4 4 4 4 4 4 4 5
      или:
      5 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 5 = 5 * 2 + 4 * 8 = 42 бита
      
    • Так как для записи используется целое число байт, то берём ближайшее не меньшее значение, кратное восьми:
    • 48 = 6·8 бит (6 байт).
    • Тогда 25 паролей занимают:
    •  6·25 = 150 байт

    📹 Видео


    11_11:

    При регистрации в компьютерной системе каждому пользователю выдается пароль, состоящий из 15 символов и содержащий только символы из 12-символьного набора A, B, C, D, E, F, G, H, I, K, L, M, N. В базе данных для хранения сведений о каждом пользователе отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование паролей, все символы кодируют одинаковым и минимально возможным количеством бит. Кроме собственно пароля, для каждого пользователя в системе хранятся дополнительные сведения, для чего отведено 12 байт на одного пользователя.

    Определите объем памяти (в байтах), необходимый для хранения сведений о 30 пользователях.
    В ответе запишите только целое число - количество байт.
      
    Типовые задания для тренировки

    Ответ: 600

    Показать решение:

    Результат: 600

    📹 Видео


    11_12:

    При регистрации в компьютерной системе каждому пользователю выдается пароль, состоящий из 7 символов и содержащий только символы из 33-символьного алфавита. В базе данных для хранения сведений о каждом пользователе отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование паролей, все символы кодируют одинаковым и минимально возможным количеством бит. Кроме собственного пароля, для каждого пользователя в системе хранятся дополнительные сведения, для чего выделено целое число байт; это число одно и то же для всех пользователей.

    Для хранения сведений о 60 пользователях потребовалось 900 байт.

    Сколько байт выделено для хранения дополнительных сведений об одном пользователе?
    В ответ запишите только целое число - количество байт.
      
    Типовые задания для тренировки

    Ответ: 9

    Показать решение:

    • Сначала определимся с паролем. По формуле Q = MN получаем:
    • 33 = 2N 
      -> N = 6 бит на 1 символ
      
    • Пароль состоит из 7 символов:
    • -> 7*6 = 42 бит всего на пароль 
    • Так как все данные о пользователях хранятся в байтах, то возьмем ближайшее число большее 42 и кратное 8:
    • 48/8 = 6
      
      42 бит ~ 6 байт
      
    • Теперь найдем сколько байт отводится для хранения информации об одном пользователе:
    • 900 байт / 60 (пользователей) = 15 байт на каждого пользователя
    • Получим объем памяти для хранения дополнительных сведений:
    • 15 байт (на хранение всей информации) - 6 байт (на хранение пароля) = 9 байт на дополнительные сведения

    📹 Видео


    11_13:

    При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 9 символов. В качестве символов используют прописные и строчные буквы латинского алфавита (в нём 26 символов), а также десятичные цифры. В базе данных для хранения сведений о каждом пользователе отведено одинаковое и минимально возможное целое число байт. При этом используют посимвольное кодирование паролей, все символы кодируют одинаковым и минимально возможным количеством бит. Кроме собственно пароля, для каждого пользователя в системе хранятся дополнительные сведения, для чего выделено 18 байт на одного пользователя. В компьютерной системе выделено 1 Кб для хранения сведений о пользователях.

    О каком наибольшем количестве пользователей может быть сохранена информация в системе? В ответе запишите только целое число – количество пользователей.

    Ответ: 40

    Показать решение:

    • Так как используются как прописные, так и строчные буквы, то получим всего вариантов символов для кодирования:
    • 26 + 26 + 10 = 62
    • Из формулы Q = 2n получим количество бит, требуемое для кодирования 1 символа пароля:
    • Q = 2n -> 
      62 = 2n ->
      n = 6
    • Поскольку в пароле 9 символов, то получим количество бит для хранения 1 пароля:
    • 6 * 9 = 54
    • Переведем в байты (т.к. по условию пароли хранятся в байтах):
    • 54 / 8 = 7 байт
    • На хранение дополнительных сведений выделено 18 байт. Получим количество байт для хранения всех сведений для одного пользователя:
    • 18 + 7 = 25 байт
    • По условию всего выделено 1 Кб для хранения сведений о всех пользователях. Переведем это значение в байты:
    • 1 Кб = 1024 байт
    • Получим возможное количество пользователей:
    • 1024 / 25 = 40,96
    • Отбросим дробную часть: 40

    📹 Видео


    Вставить формулу как
    Блок
    Строка
    Дополнительные настройки
    Цвет формулы
    Цвет текста
    #333333
    Используйте LaTeX для набора формулы
    Предпросмотр
    \({}\)
    Формула не набрана
    Вставить