Разбор
Число может принимать значения от до . При фиксированном значении остальные числа последовательности определяются однозначно. Перебираем от до , восстанавливаем последовательность и проверяем, является ли она перестановкой чисел от до (все должны быть разные и находиться в промежутке от до ). Как только восстановленная последовательность будет перестановкой, выводим ее и завершаем работу программы.
Поскольку , то или .
Пример
Пусть . Тогда последовательность порождает следующую последовательность :
Последовательность является перестановкой. Имеют место соотношения: и .
Если, например, выбрать , то по входной последовательности будет восстановлена следующая последовательность :
Последовательность не является перестановкой.
Реализация алгоритма
Объявим рабочие массивы. Массив будет использоваться для проверки, является ли перестановкой.
#define MAX 1001 int a[MAX], b[MAX], used[MAX];
Читаем входные данные.
scanf("%d", &n); for (i = 0; i < n - 1; i++) scanf("%d", &b[i]);
Перебираем значение от до .
for (a0 = 1; a0 <= n; a0++) { a[0] = a0;
Вычисляем элементы последовательности по формуле .
for (i = 1; i < n; i++) a[i] = b[i - 1] - a[i - 1];
Обнуляем массив .
for (i = 1; i <= n; i++) used[i] = 0;
Проверяем, является ли перестановкой. Для этого каждое из значений должно встречаться в последовательности только один раз, и находиться в промежутке от до . Переменная устанавливается в , если последовательность не является перестановкой.
flag = 0; for (i = 0; i < n; i++) { if (a[i] < 1 || a[i] > n || used[a[i]]) { flag = 1; break; } used[a[i]] = 1; }
Если последовательность является перестановкой, то выводим ее и завершаем работу программы.
if (flag == 0) { for (i = 0; i < n; i++) printf("%d ", a[i]); printf("\n"); return 0; } }
Python реализация
Читаем входные данные.
n = int(input()) b = list(map(int, input().split()))
Объявим рабочие массивы. Массив будет использоваться для проверки, является ли перестановкой.
a = [0] * n used = [0] * (n + 1)
Перебираем значение от до .
for a0 in range(1, n + 1): a[0] = a0
Вычисляем элементы последовательности по формуле .
for i in range(1, n): a[i] = b[i - 1] - a[i - 1]
Обнуляем массив .
for i in range(1, n + 1): used[i] = 0
Проверяем, является ли перестановкой. Для этого каждое из значений должно встречаться в последовательности только один раз, и находиться в промежутке от до . Переменная устанавливается в , если последовательность не является перестановкой.
flag = 0 for i in range(n): if a[i] < 1 or a[i] > n or used[a[i]]: flag = 1 break used[a[i]] = 1
Если последовательность является перестановкой, то выводим ее и завершаем работу программы.
if flag == 0: print(*a) break