Дан массив in
из n целых чисел. Постройте массив out такой,
чтобы каждый элемент outi был равен произведению всех
элементов массива in, кроме ini.
Вход. Первая строка содержит целое число n (1 < n ≤ 106). Вторая строка
содержит n целых чисел, каждое по модулю не
превышает 100.
Выход. Выведите массив
out. Гарантируется,
что абсолютное значение каждого выведенного числа не превышает 2 * 109.
|
Пример
входа 1 |
Пример
выхода 1 |
|
4 1 2 3 4 |
24 12 8 6 |
|
|
|
|
Пример
входа 2 |
Пример
выхода 2 |
|
4 2 0 1 4 |
0 8 0 0 |
массивы
Анализ алгоритма
Пусть in –
входной массив, индексацию начнем с 1. Тогда входные числа хранятся в in[1], in[2],
…, in[n]. Если вычислить произведение
p всех элементов массива in, а затем положить outi = p / ini (out
– результирующий массив), то такой метод не работает в случае, когда ini = 0.
Рассмотрим
другой подход. Построим два массива:
·
Массив префиксных произведений pref, в котором
pref[i] = in[1] * in[2] * … * in[i],
при
этом положим pref[0] = 1;
·
Массив суффиксных произведений suf, в котором
suf[i] = in[i] * in[i + 1] * … * in[n],
при
этом положим suf[n + 1] = 1;

Тогда outi = pref[i – 1] * suf[i + 1].
Пример

Реализация алгоритма
Объявим рабочие
массивы.
#define MAX 1000002
int in[MAX], pref[MAX], suf[MAX], res[MAX];
Читаем входные
данные.
scanf("%d",&n);
for(i = 1; i <= n; i++)
scanf("%d",&in[i]);
// [1,2,3,4]
Строим массив произведений префиксов.
pref[0] = 1;
for(i = 1; i <= n;
i++) // [1,2,6,24]
pref[i] = pref[i-1] * in[i];
Строим массив произведений суффиксов.
suf[n+1] = 1;
for(i = n; i >= 1; i--) // [24,24,12,4]
suf[i] = suf[i+1] * in[i];
Строим результирующий массив.
for(i = 1; i <= n; i++) // [24,12,8,6]
res[i] = pref[i-1] * suf[i+1];
Выводим ответ.
for(i = 1; i <= n; i++)
printf("%d
",res[i]);
printf("\n");