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 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
#define pb push_back
#define mp make_pair
#define fi first
#define se second

typedef long long ll;
typedef long double ld;
typedef unsigned long long  ull;
typedef vector<int> vi;

struct pp{ll x,y;};

const int base = 1000*1000*1000;
const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
const int inf = (int)1e9;
const int mod = 1e9+7;
ll gcd (ll a, ll b) {
        while (b) {
            a %= b;
            swap (a, b);
        }
        return a;
}

/*
void quickSort(int left, int right) {
      int i = left, j = right;
      pp tmp;
      int pivot = a[(left + right) / 2].x;
      while (i <= j) {
            while (a[i].x < pivot)
                  i++;
            while (a[j].x > pivot)
                  j--;
            if (i <= j) {
                 swap(a[i],a[j]);
                  i++,j--;
            }
      };
    if (left < j)
            quickSort(left, j);
      if (i < right)
            quickSort(i, right);
}*/
ll binpow (ll a, ll n) {
	ll res = 1;
	while (n) {
		if (n & 1)
			res *= a,res %= mod;
		a *= a,a %= mod;
		n >>= 1;
	}
	return res;
}
const int MaxN = 1e5 + 17;
ll a[111111],n,sum;
int main(){
    cin>>n;
    for(ll i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    if(sum%(n*(n+1)/2)){
        cout<<"NO";
        return 0;
    }
    ll x=sum/(n*(n+1)/2),cnt=0;
    for(ll i=1;i<=n;i++){
            if(i==n&&n==2)break;
        ll b=a[i%n]-a[i-1];
        if(abs(b+(n-1)*x)%n||b+(n-1)*x<0){
            cout<<"NO";
            return 0;
        }
        else cnt+=x-(b+(n-1)*x)/n;
    }
    cout<<"YES";

    return 0;
}