---
# System prepended metadata

title: ЕГЭ

---

# ЕГЭ

## 24

==ПРОВЕРЯЙ ЧЕРЕЗ CTRL+F, ЕСЛИ ЕСТЬ ВОЗМОЖНОТЬ==

### 24 с количеством одинаковых символов

```cpp=
/**
 * Одинаковые символы идущие подряд (вероятно, найти самую длинную цепочку, в ответ символ и длину)
*/
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
    fstream file;
    file.open("24test.txt", ios::in);
    string line;
    getline(file, line);
    int max_len = 0;
    int curr_len = 0;
    char max_char = ' ';
    for (int i = 1; i < line.size(); i++) {
        curr_len = 1;
        while (line[i] == line[i - 1] && i < line.size()) {
            i++;
            curr_len++;
        }
        if (curr_len > max_len) {
            max_len = curr_len;
            max_char = line[i - 1];
        }
    }
    cout << curr_len << " " << max_char << endl;
}
```

### 24 с подстрокой без AD
```cpp=
/**
 * Максимальная длина подстроки в которой нет AD
*/
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main() {
    fstream file;
    file.open("24test.txt", ios::in);
    string line;
    getline(file, line);
    int max_counter = 0;
    int curr_len = 1;

    for (int i = 1; i < line.size(); i++) {
        // aaaaddadadaaa
        if (line[i - 1] == 'A' && line[i] == 'D') {
            if (curr_len > max_counter) {
                max_counter = curr_len;
            }
            curr_len = 1;
        } else {
            curr_len++;
        }
    }
    cout << max_counter << endl;
}
```

## 25

### Количество простых

```cpp=
/**
 * Количество простых на отрезке
*/
#include <iostream>
#include <math.h>
using namespace std;

bool is_prime(int n) {
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int start = 100000;
    int end = 400000;
    int counter = 0;
    for (int i = start; i <= end; i++) {
        if (is_prime(i)) {
            counter++;
        }
    }
    cout << counter << endl;
}
```

### У большого числа ровно 5 нечётных делителей

```cpp=
/**
 * Найдите все натуральные числа, принадлежащие отрезку [35 000 000; 40 000 000], у которых ровно пять различных нечётных делителей (количество чётных делителей может быть любым). В ответе перечислите найденные числа в порядке возрастания.
*/
#include <iostream>
#include <math.h>
using namespace std;

int is_prime(int n) {
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

bool five_divs(int n) {
    // пусть a, b, c - простые числа > 2
    // n = a*b*c: 1, a, b, c, ab, bc, ac, abc   | 8 divs
    // n = a*b*b: 1, a, b, ab, bb, abb          | 6 divs
    // n = a*a*a: 1, a, aa, aaa                 | 4 divs
    // n = a*a*a*a:                             | 5 divs
    // n = a*a*a*a*a:                           | 6 divs
    while (n % 2 == 0) {
        n /= 2;
    }
    int s1 = sqrt(n);
    int s2 = sqrt(s1);
    if (s2 * s2 * s2 * s2 != n) {
        return false;
    }
    return is_prime(s2);
}

int main() {
    for (int i = 35000000; i <= 40000000; i++) {
        if (five_divs(i)) {
            cout << i << endl;
        }
    }
}
```

## 26 чемоданы

==ВНИМАТЕЛЬНО ЧИТАЙ УСЛОВИЕ, ОНО МОЖЕТ ОТЛИЧАТЬСЯ==
Первая строка: количество чемоданов и максимальный вес, который можно загрузить

Дальше - вес каждого чемодана

В ответе недо указать, сколько чемоданов можно загрузить и вес минимального, незагруженного

```cpp=
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    fstream file;
    file.open("26.txt", ios::in);
    string line;
    getline(file, line, ' ');
    int N = stoi(line);
    getline(file, line);
    int K = stoi(line);
    vector<int> arr;
    for (int i = 0; i < N; i++) {
        getline(file, line);
        arr.push_back(stoi(line));
    }
    file.close();
    sort(arr.begin(), arr.end());
    int i = 0;
    int counter = 0;
    while (K >= 0) {
        K -= arr[i];
        counter++;
        i++;
    }
    counter--;
    i--;
    K += arr[i];
    cout << counter << " " << arr[i] << endl;
}
```

## 27

### Условие:

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

### Пример (генерирую на основе Полякова)

11 - N (кол-во чисел)
4 
14
27
39
7
2
13
6
7
26
1

### Идея решения

Задача очень похожа на ту, где мы находили минимальную сумму квадратов пар. Идея решения заключается в том, чтобы хранить для кажого шага количество элементов, кратное 13:



| Входные данные | Количество чисел, кратных 13 на данный момент (`vector<int> arr`  ) |
| -------------- |:--------------------------------------------- |
| 4              | 0                                             |
| 14             | 0                                             |
| 27             | 0                                             |
| 39             | 1                                             |
| 7              | 1                                             |
| 2              | 1                                             |
| 13             | 2                                             |
| 6              | 2                                             |
| 7              | 2                                             |
| 26             | 3                                             |
| 1              | 3                                             |


Обновление счётчика:

1. Если новое значение некратно 13, то `counter += arr[i-5]` (образуется столько новых пар, сколько чисел, кратных 13 было в доступном промежудке)
2. Если новое значение кратно 13, то `counter+= i-5+1` (+1 из-за того, что индексация с 0) - мы можем образовать i-5 новых пар (т.е. по паре со всеми числами из доступного промежудка)

```cpp=
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    int K = 13;
    fstream file;
    file.open("27.txt", ios::in);
    string line;
    getline(file, line);
    int N = stoi(line);
    vector<int> arr;
    int counter = 0;
    for (int line_index = 0; line_index < N; line_index++) {
        getline(file, line);
        int v = stoi(line);
        int increment = int(v % K == 0);

        if (line_index == 0) {
            arr.push_back(increment);
        } else {
            arr.push_back(arr[arr.size() - 1] + increment);
        }
        if (line_index >= 5) {
            if (increment) {
                counter += line_index - 5 + 1;
            } else {
                counter += arr[line_index - 5];
            }
        }
    }
    file.close();
    cout << counter << endl;
}
```