Problem:
Problem G: Painting

Problem

長さ$N$の数列$X$が与えられる。初期状態では$X$の要素は全て$0$である。加えて、$M$個の整数のペア$(A_i, B_i)$が与えられる。各ペアに対し以下の操作を行い、最終的な数列$X$を出力せよ。

整数$j$ $(1 \le j \le N)$に対し、$(A_i+j)$を$B_i$で割った余りを$X_j$に加える。

Input

入力は以下の形式で与えられる。

$N$ $M$
$A_1$ $B_1$
$A_2$ $B_2$
:
$A_M$ $B_M$

$1$行目に、与えられる数列の要素数$N$、ペアの数$M$が空白区切りで与えられる。

続く$M$行に、$i$番目のペア$(A_i, B_i)$が空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

$1 \le N, M \le 10^5$

$0 \le A_i < B_i \le 10^9 (1 \le i \le M)$

与えられる入力は全て整数である

Output

操作後の数列を$N$行で出力せよ。$j$行目に$X_j$を出力せよ。

Sample Input 1

5 3
1 4
3 7
0 1000

Sample Output 1

7
10
9
5
8

Sample Input 2

14 12
1 4
2 3
0 5
1 4
1 2
0 8
0 2
0 10
0 1
0 8
3 10
1 10

Sample Output 2

15
24
25
31
35
44
32
25
24
15
16
25
31
40

Solution in C# (judge verdict: Accepted)

using System;

public class Hello
{
    public static void Main()
    {
        string[] line = Console.ReadLine().Trim().Split(' ');
        var n = int.Parse(line[0]);
        var m = int.Parse(line[1]);
        var a = new int[m];
        var b = new int[m];
        for (int i = 0; i < m; i++)
        {
            line = Console.ReadLine().Trim().Split(' ');
            a[i] = int.Parse(line[0]);
            b[i] = int.Parse(line[1]);
        }
        var c = getAns(a, b, n, m);
        var p1 = 0L;
        for (int i = 0; i < m; i++) p1 += (a[i] + 1) % b[i];
        print(c, p1, n, m);

    }
    static void print(long[] c, long p1, int n, int m)
    {
        for (int i = 1; i <= n; i++)
        {
            var w = p1 + c[i] + m * (long)(i - 1);
            Console.WriteLine(w);
        }
    }
    static long[] getAns(int[] a, int[] b, int n, int m)
    {
        var c = new long[n + 1];
        for (int i = 0; i < m; i++)
        {
            var bi = b[i];
            var p = bi - a[i];
            while (p <= n)
            {
                if (p != 1) c[p] -= bi;
                p += bi;
            }
        }
        for (int i = 2; i <= n; i++)
            c[i] = c[i - 1] + c[i];
        return c;
    }
}