Andrewid the Android is a galaxy-famous detective. He is now investigating a case of frauds who make fake copies of the famous Stolp's gears, puzzles that are as famous as the Rubik's cube once was.

Its most important components are a button and a line of n similar gears. Each gear has n teeth containing all numbers from 0 to n - 1 in the counter-clockwise order. When you push a button, the first gear rotates clockwise, then the second gear rotates counter-clockwise, the the third gear rotates clockwise an so on.

Besides, each gear has exactly one active tooth. When a gear turns, a new active tooth is the one following after the current active tooth according to the direction of the rotation. For example, if n = 5, and the active tooth is the one containing number 0, then clockwise rotation makes the tooth with number 1 active, or the counter-clockwise rotating makes the tooth number 4 active.

Andrewid remembers that the real puzzle has the following property: you can push the button multiple times in such a way that in the end the numbers on the active teeth of the gears from first to last form sequence 0, 1, 2, ..., n - 1. Write a program that determines whether the given puzzle is real or fake.

Input

The first line contains integer n (1 ≤ n ≤ 1000) — the number of gears.

The second line contains n digits a1, a2, ..., an (0 ≤ ai ≤ n - 1) — the sequence of active teeth: the active tooth of the i-th gear contains number ai.

Output

In a single line print "Yes" (without the quotes), if the given Stolp's gears puzzle is real, and "No" (without the quotes) otherwise.

Examples

Input

3
1 0 0


Output

Yes


Input

5
4 2 1 4 3


Output

Yes


Input

4
0 2 3 1


Output

No

Note

In the first sample test when you push the button for the first time, the sequence of active teeth will be 2 2 1, when you push it for the second time, you get 0 1 2.
//      これを翻訳している間、あなたはあなたの人生のいくつかの貴重な瞬間を無駄にしました
// secondThread orz

    
        import java.io.*;
        import java.math.BigDecimal;
        import java.math.BigInteger;
        import java.util.*;
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
    
    
        public class main2 {

            static boolean isYes(int[] a){
                for(int i = 0;i<a.length;i++){
                    if(a[i]!=i)
                        return false;
                }
                return true;
            }


    
            public static void main(String[] args) {
                try {


                    PrintWriter fop = new PrintWriter(System.out);
                    FastScanner fsca = new FastScanner();


                    int n = fsca.nextInt();
                    int[] a = fsca.readArray(n);
                    for(int i = 0;i<n;i++){
                        for(int j = 0;j<n;j++){
                            if((j&1)==0){
                                a[j] = (a[j]+1)%n;
                            }else{
                                if(a[j]>0)
                                    a[j] = (a[j]-1)%n;
                                else
                                    a[j] = n-1;
                            }
                        }
                        if(isYes(a)){
                            fop.println("Yes");
                            fop.close();
                            return ;
                        }
                    }
                    fop.println("No");

                    fop.close();


















                    fop.flush();
                    fop.close();
                } catch (Exception e) {
                    return;
                }
    
    
            }
            /*-----------------------------------------------------------------------------------------------------------------------------------------------*/
    
    
//            static void sieve(int n) {
//                boolean[] flag = new boolean[n];
//
//                for (int i = 2; i * i < n; i++) {
//                    if (flag[i])
//                        continue;
//                    else
//                        for (int j = i * i; j <= n; j += i) {
//                            flag[j] = true;
//                        }
//                }
//            }
//
//
//            static int gcd(int a, int b) {
//                if (b > a) {
//                    int tenp = b;
//                    b = a;
//                    a = tenp;
//                }
//                int temp = 0;
//                while (b != 0) {
//                    a %= b;
//                    temp = b;
//                    b = a;
//                    a = temp;
//                }
//                return a;
//            }
//
//            static long gcd_long(long a, long b) {
//                if (b > a) {
//                    long tenp = b;
//                    b = a;
//                    a = tenp;
//                }
//                long temp = 0;
//                while (b != 0) {
//                    a %= b;
//                    temp = b;
//                    b = a;
//                    a = temp;
//                }
//                return a;
//            }
    
    
            static final Random random = new Random();
    
            static void ruffleSort(int[] a) {
                int n = a.length;//shuffle, then sort
                for (int i = 0; i < n; i++) {
                    int oi = random.nextInt(n), temp = a[oi];
                    a[oi] = a[i];
                    a[i] = temp;
                }
                Arrays.sort(a);
            }
    
    
            static class FastScanner {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                StringTokenizer st = new StringTokenizer("");
    
                String next() {
                    while (!st.hasMoreTokens())
                        try {
                            st = new StringTokenizer(br.readLine());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    return st.nextToken();
                }
    
                int nextInt() {
                    return Integer.parseInt(next());
                }
    
                int[] readArray(int n) {
                    int[] a = new int[n];
                    for (int i = 0; i < n; i++) a[i] = nextInt();
                    return a;
                }
    
                long[] readLongArray(int n) {
                    long[] a = new long[n];
                    for (int i = 0; i < n; i++)
                        a[i] = nextLong();
                    return a;
                }
    
                long nextLong() {
                    return Long.parseLong(next());
                }
            }
    
    
        }
    
    
    
    
    
    
    
    
