Вопрос Решите задачу на с++. просто кодом или письменно алгоритмом.

Регистрация
4 Ноя 2013
Сообщения
78
Репутация
0
Спасибо
0
Монет
0
Дано число n . Найдите максимальный размер интервала [l,r] из целых положительных чисел такого, что для каждого числа i из этого интервала (т.е. l≤i≤r ) n кратно i . Если вам даны два целых числа l≤r , то размер интервала [l,r] равен r−l+1 (т.е. совпадает с количеством целых чисел, принадлежащих интервалу). Входные данные Первая строка содержит единственное целое число t (1≤t≤104 ) — количество наборов входных данных. Единственная строка каждого набора входных данных содержит одно целое число n (1≤n≤1018 ). Выходные данные Для каждого набора входных данных вывести одно целое число: максимальный размер допустимого интервала.

Пример

входные данные

10

1

40

990990

4204474560

169958913706572972

365988220345828080

387701719537826430

620196883578129853

864802341280805662

1000000000000000000

выходные данные

1

2

3

6

4

22

3

1

2

2

Примечание В первом наборе входных данных допустимым интервалом с максимальным размером является [1,1] (он допустим, так как n=1 кратно 1 ) и его размер равен 1 . Во втором наборе входных данных допустимым интервалом с максимальным размером является [4,5] (он допустим, так как n=40 кратно 4 и 5 ), а его размер равен 2 . В третьем наборе входных данных допустимым интервалом с максимальным размером является [9,11] . В четвертом наборе входных данных допустимым интервалом с максимальным размером является [8,13] . В седьмом наборе входных данных допустимым интервалом с максимальным размером является [327869,327871]
 
Алгоритм решения задачи:

1. Считываем количество наборов входных данных t.
2. Для каждого набора входных данных:
- Считываем число n.
- Инициализируем переменную maxSize = 0, которая будет хранить максимальный размер интервала.
- Инициализируем переменные l = 1 и r = n, которые будут хранить границы интервала.
- Пока l <= r:
- Если n кратно l и r:
- Вычисляем размер текущего интервала currSize = r - l + 1.
- Если currSize > maxSize, обновляем maxSize = currSize.
- Увеличиваем l на 1 и уменьшаем r на 1.
- Если n не кратно l, увеличиваем l на 1.
- Если n не кратно r, уменьшаем r на 1.
- Выводим maxSize.

Пример реализации на C++:

```cpp
#include <iostream>

using namespace std;

int main() {
int t;
cin >> t;

for (int i = 0; i < t; i++) {
long long n;
cin >> n;

int maxSize = 0;
long long l = 1, r = n;

while (l <= r) {
if (n % l == 0 && n % r == 0) {
int currSize = r - l + 1;
if (currSize > maxSize) {
maxSize = currSize;
}
l++;
r--;
} else if (n % l != 0) {
l++;
} else if (n % r != 0) {
r--;
}
}

cout << maxSize << endl;
}

return 0;
}
```
 
#include
#define int long long

using namespace std;

void solve() {
int n; cin >> n;
int res = 1;
for (int i = 2; i
 
секрет в том, что для любого n один из оптимальных отрезков будет начинаться в единице, со знанием этого факта задача решается элементарно
доказательство оставляем читателю в качестве упражнения
 
#include
#include
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
long long n;
cin >> n;
long long ans = 1;
for (long long i = 2; i * i
 
Назад
Сверху