1228. Массив

 

Рассмотрим n - арный массив Х, объявленный как array[0..k1, 0..k2, … , 0..kn]. Порядок P элемента X[i1, i2, …, in] вычисляется по формуле P(i1, i2, …, in) = 1 + d1 * i1 + d2 * i2 + … + dn * in. Числа d1, d2, …, dn называются индексными множителями.

Рассмотрим массив X[0..2, 0..1, 0..3] и его индексные множители d1 = 8, d2 = 4, d3 = 1. Порядок элемента X[1, 0, 3] равен P(1, 0, 3) = 1 + 8*1 + 4*0 + 1*3 = 13..

В задаче необходимо найти верхнюю границу для каждой размерности (k1, k2, …, kn) по заданным индексным множителям и общим количеством элементов в массиве s.

 

Вход. Первая строка содержит размерность массива n (1 £ n £ 20) и общее число элементов s (1 £ s £ 231 – 1) в массиве. Следующие n строк содержат индексные множители d1, d2, …, dn.

 

Выход. Определить верхнюю границу для каждой размерности в порядке k1, k2, …, kn (0 < ki £ 1000). Выводимые размерности разделять пробелами или символами CR/LF.

 

Пример входа

3 24

8

4

1

 

Пример выхода

2 1 3

 

 

РЕШЕНИЕ

элементарные вычисления

 

Анализ алгоритма

Если величина текущего индексного множителя равна di, а текущее число элементов равно s, то граница i - ой размерности может быть максимум s / di. Оставшиеся s % di элементов следует располагать в следующих размерностях.

 

Реализация алгоритма

В массиве x храним входные индексные множители, в массиве k вычисляем верхнюю границу размерностей.

 

int x[20],k[20];

 

Читаем входные данные, заносим индексные множители в массив x.

 

scanf("%d %d",&n,&s);

for(i=0;i<n;i++) scanf("%d",&x[i]);

 

Вычисляем верхние границы размерностей и заносим их в массив k. Затем выводим их.

 

s--;

for(i=0;i<n;i++)

  k[i] = s / x[i],s %= x[i];

for(i=0;i<n;i++) printf("%d ",k[i]); printf("\n");