# ЕГЭ
## 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;
}
```