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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strconv"
	"strings"
)

func readInput() ([]string, error) {
	bytes, err := ioutil.ReadAll(os.Stdin)
	s := string(bytes)
	if err != nil {
		return []string{""}, err
	}
	return strings.Split(s, "\n"), nil
}

func convNewline(str, nlcode string) string {
	return strings.NewReplacer(
		"\r\n", nlcode,
		"\r", nlcode,
		"\n", nlcode,
	).Replace(str)
}

func jd(i int, ai []string) bool {
	counter := 0
	for {
		value, _ := strconv.Atoi(ai[counter])
		log.Printf("jd i:%v, len:%v, ai:%v", counter, len(ai), value)
		if value < (counter + 1) { //取り出せるか
			log.Printf("return v:%v,c:%v", value, counter)
			return false
		}

		// 終了判定
		counter = counter + 1
		if (counter) >= i {
			log.Printf("break, i:%v", i)
			break
		}
	}
	return true
}

func judge(i int, ai []string) bool {

	for j := 0; j < i; j++ {
		// re-index
		new := []string{}
		for cnt := j; cnt < i+j; cnt++ {
			if cnt > (i - 1) {
				new = append(new, ai[cnt-i])
				continue
			}
			new = append(new, ai[cnt])
		}
		log.Printf("j:%v, i:%v, new:%v", j, i, new)
		// OKかどうか
		if jd(i, new) {
			return true
		}
		log.Printf("NG: j:%v", j)
	}
	return false
}

func main() {
	input, err := readInput()
	if err != nil {
		log.Fatal(err)
	}

	i, _ := strconv.Atoi(input[0])
	ai := strings.Split(input[1], " ")
	if judge(i, ai) {
		fmt.Println("YES")
		return
	}
	fmt.Println("NO")

}