Problem:
Score : 500 points

Problem Statement

There are N boxes arranged in a circle. The i-th box contains A_i stones.

Determine whether it is possible to remove all the stones from the boxes by repeatedly performing the following operation:

Select one box. Let the box be the i-th box. Then, for each j from 1 through N, remove exactly j stones from the (i+j)-th box. Here, the (N+k)-th box is identified with the k-th box.

Note that the operation cannot be performed if there is a box that does not contain enough number of stones to be removed.

Constraints

1 ≦ N ≦ 10^5

1 ≦ A_i ≦ 10^9

Input

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

N
A_1 A_2 … A_N

Output

If it is possible to remove all the stones from the boxes, print YES. Otherwise, print NO.

Sample Input 1

5
4 5 1 2 3

Sample Output 1

YES

All the stones can be removed in one operation by selecting the second box.

Sample Input 2

5
6 9 12 10 8

Sample Output 2

YES

Sample Input 3

4
1 2 3 1

Sample Output 3

NO

Solution in C++14 (Clang 3.8.0) (judge verdict: Wrong Answer)

#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
using namespace std;
typedef long long int lli;
lli MOD = 1000000;
int main()
{
    lli n;
    cin >> n;
    lli a[100005];
    rep(i, n) cin >> a[i];
    lli sum = 0;
    rep(i, n) sum += a[i];
    lli ma = *max_element(a, a + n);
    lli mi = *min_element(a, a + n);
    lli sumn = (n + 1) * n / 2;
    if (sum % sumn) {
        cout << "NO" << endl;
        return 0;
    }
    lli kai = sum / sumn;
    set<int> s;
    rep(i, n - 1)
    {
        if (a[i] != a[i + 1]) {
            break;
        }
        if (i == n - 2) {
            if (a[i] % n == 0) {
                cout << "YES" << endl;
                return 0;
            }
        }
    }
    rep(i, n)
    {
        if (a[i] % n != 0) {
            break;
        }
        if (i == n - 1) {
            int b[1000005] = {};
            rep(j, n)
            {
                b[j] = a[j] / n;
            }
            set<int> l;
            rep(j, n)
            {
                l.insert(b[j]);
            }
            if (l.size() == n && ma == kai * n && mi == kai) {
                cout << "YES" << endl;
            }
        }
    }
    rep(i, n)
    {
        s.insert(a[i] % n);
    }

    if (s.size() != n || ma > kai * n || mi < kai) {
        cout << "NO" << endl;
    } else {
        cout << "YES" << endl;
    }
}