Python (3.5), 63 62 bytes
def f(a): r=[0] for i in a:r+=i*(r[-1]//i+1), return r[1:] Test
>>> print('\n'.join([str(i)+' => '+str(f(i)) for i in [[9],[1,2],[2,1],[7,3],[1,1,1,1],[5,4,12,1,3],[3,3,3,8,16],[6,5,4,3,2,1],[9,4,6,6,5,78,12,88],[8,9,41,5,12,3,5,6],[15,8,12,47,22,15,4,66,72,15,3,4]]])) [9] => [9] [1, 2] => [1, 2] [2, 1] => [2, 3] [7, 3] => [7, 9] [1, 1, 1, 1] => [1, 2, 3, 4] [5, 4, 12, 1, 3] => [5, 8, 12, 13, 15] [3, 3, 3, 8, 16] => [3, 6, 9, 16, 32] [6, 5, 4, 3, 2, 1] => [6, 10, 12, 15, 16, 17] [9, 4, 6, 6, 5, 78, 12, 88] => [9, 12, 18, 24, 25, 78, 84, 88] [8, 9, 41, 5, 12, 3, 5, 6] => [8, 9, 41, 45, 48, 51, 55, 60] [15, 8, 12, 47, 22, 15, 4, 66, 72, 15, 3, 4] => [15, 16, 24, 47, 66, 75, 76, 132, 144, 150, 153, 156] Previous solution
Asome recursive onesolutions but a bit larger (68 bytes)
(68 bytes) f=lambda a,i=0:[i,*f(a[1:],a[0]*(i//a[0]+1))][i==0:]if a!=[]else[i] (64 bytes) f=lambda a,i=0:a>[]and[i,*f(a[1:],a[0]*(i//a[0]+1))][i<1:]or[i]