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 <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=1e5+100;
int a[N];
const int Max=1e5+10;
bool prime[N];
void IsPrime(){
     prime[0]=prime[1]=0;prime[2]=1;
     for(int i=3;i<Max;i++)
        prime[i]=i%2==0?0:1;
     int t=(int)sqrt(Max*1.0);
     for(int i=3;i<=t;i++)
       if(prime[i])
         for(int j=i*i;j<Max;j+=2*i)
            prime[j]=0;
}
int main()
{
    IsPrime();
    int n;
    while(~scanf("%d",&n))
    {
       for(int i=1;i<=n;i++) scanf("%d",&a[i]);
       int m=n;
       if(n==1) {puts("YES");continue;}
       while(m>1&&!prime[m]) m--;
         //  cout<<m<<endl;
           int id=-1;
           for(int i=1;i<=n;i++) if(a[i]%m==0)
           {
               id=i;break;
           }
           if(id==-1) {puts("YES");continue;}
           int flag1=0,flag2=0,j,j1;
           for(int i=id;i<=id+n;i++)
           {
               if(i%n==0) j=n;
               else j=i%n;
               if((m+i-id)%n==0) j1=n;
               else j1=(m+i-id)%n;
               if(a[j]%(i-id+1))  flag1=1;
               if(a[j]%(j1)) flag2=1;
           }
           if(!flag1||!flag2) puts("YES");
           else puts("NO");
    }
    return 0;
}