Problem:
Score : 1400 points

Problem Statement

Snuke got an integer sequence from his mother, as a birthday present. The sequence has N elements, and the i-th of them is i.
Snuke performs the following Q operations on this sequence. The i-th operation, described by a parameter q_i, is as follows:

Take the first q_i elements from the sequence obtained by concatenating infinitely many copy of the current sequence, then replace the current sequence with those q_i elements.

After these Q operations, find how many times each of the integers 1 through N appears in the final sequence.

Constraints

1 ≦ N ≦ 10^5

0 ≦ Q ≦ 10^5

1 ≦ q_i ≦ 10^{18}

All input values are integers.

Input

The input is given from Standard Input in the following format:

N Q
q_1
:
q_Q

Output

Print N lines. The i-th line (1 ≦ i ≦ N) should contain the number of times integer i appears in the final sequence after the Q operations.

Sample Input 1

5 3
6
4
11

Sample Output 1

3
3
3
2
0

After the first operation, the sequence becomes: 1,2,3,4,5,1.

After the second operation, the sequence becomes: 1,2,3,4.

After the third operation, the sequence becomes: 1,2,3,4,1,2,3,4,1,2,3.

In this sequence, integers 1,2,3,4,5 appear 3,3,3,2,0 times, respectively.

Sample Input 2

10 10
9
13
18
8
10
10
9
19
22
27

Sample Output 2

7
4
4
3
3
2
2
2
0
0

Solution in C++ (GCC 9.2.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
using namespace std;
const int MN = 100003;

int n,q,tp;
long long a[MN];

long long times[MN], ans[MN];

void divide(long long len, long long timeS) { // 把给 “ans数组加上第 id 次操作后的序列的长度为 len 的前缀 timeS 次” 分解
    int j = upper_bound(a+1,a+tp+1,len) - a - 1;
    if(!j) ans[1]+=timeS, ans[len+1]-=timeS;
    else {
        times[j] += (len/a[j]) * timeS;
        divide(len%a[j], timeS);
    }
}

int main() {
    scanf("%d%d", &n,&q);
    a[++tp] = (long long)n;
    for(int i=1;i<=q;++i) {
        long long x;
        scanf("%lld",&x);
        while(tp && a[tp]>=x) --tp;
        a[++tp] = x;
    }
    
    times[tp] = 1ll; //题目就是要求把 ans 数组加上一个最终数列
    for(int i=tp;i>1;--i) {
        times[i-1] += (a[i]/a[i-1])*times[i]; //分解前面的整段
        divide(a[i]%a[i-1],times[i]);
    }
    ans[1] += times[1];
    ans[a[1]+1] -= times[1];
    for(int i=2;i<=n;++i) ans[i] += ans[i-1];
    for(int i=1;i<=n;++i) cout << ans[i] << '\n';
    return 0;
}