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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		long sum = 0;
		for(int i=0;i<N;i++) sum += A[i];
		
		long inc = (long)N * (long) (N+1) / 2;
		if(sum % inc != 0){
			Console.WriteLine("NO");
			return;
		}
		
		long tot = sum / inc;
		
		long[] B = new long[N];
		for(int i=0;i<N;i++){
			long diff = A[i] - A[(i-1+N)%N];
			if((tot - diff) % N != 0){
				Console.WriteLine("NO");
				return;
			}
			B[i] = (tot - diff)/N;
		}
		
		long cnt = 0;
		for(int i=0;i<N;i++) cnt += B[i];
		if(cnt != tot){
			Console.WriteLine("NO");
			return;
		}
		
		//Console.WriteLine(String.Join(" ",B));
		
		long a = 0;
		for(int i=0;i<N;i++){
			a += B[i] * (N-i);
		}
		
		//Console.WriteLine(a);
		
		
		Console.WriteLine(a == A[N-1] ? "YES": "NO");
		
		
	}
	int N;
	long[] A;
	public Sol(){
		N = ri();
		A = rla();
	}

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}