You are given a regular polygon with n vertices labeled from 1 to n in counter-clockwise order. The triangulation of a given polygon is a set of triangles such that each vertex of each triangle is a vertex of the initial polygon, there is no pair of triangles such that their intersection has non-zero area, and the total area of all triangles is equal to the area of the given polygon. The weight of a triangulation is the sum of weigths of triangles it consists of, where the weight of a triagle is denoted as the product of labels of its vertices.

Calculate the minimum weight among all triangulations of the polygon.

Input

The first line contains single integer n (3 ≤ n ≤ 500) — the number of vertices in the regular polygon.

Output

Print one integer — the minimum weight among all triangulations of the given polygon.

Examples

Input


3


Output


6


Input


4


Output


18

Note

According to Wiki: polygon triangulation is the decomposition of a polygonal area (simple polygon) P into a set of triangles, i. e., finding a set of triangles with pairwise non-intersecting interiors whose union is P.

In the first example the polygon is a triangle, so we don't need to cut it further, so the answer is 1 ⋅ 2 ⋅ 3 = 6.

In the second example the polygon is a rectangle, so it should be divided into two triangles. It's optimal to cut it using diagonal 1-3 so answer is 1 ⋅ 2 ⋅ 3 + 1 ⋅ 3 ⋅ 4 = 6 + 12 = 18.
//Created by Kunal Dwivedi on 3/22/2019

import java.io.*;
import java.net.Inet4Address;
import java.util.*;

public final class contest {


    static class pair {
        long first, second;

        public pair(long f, long s) {
            first = f;
            second = s;
        }

        @Override
        public String toString() {
            return first + "," + second;
        }
    }

    public static void main(String args[]) throws IOException {

long ans=0;
        int n = in.ni();
        for(int i=2;i<=n-1;i++)
           ans+=i*(i+1);
        out.prn(ans);


   /*
        PriorityQueue<pair> pq2=new PriorityQueue<>(new Comparator<pair>() {
            @Override
            public int compare(pair o1, pair o2) {
                return o1.second > o2.second? -1 : 1;
            }
        });
        PriorityQueue<pair> pq3=new PriorityQueue<>(new Comparator<pair>() {
            @Override
            public int compare(pair o1, pair o2) {
                return o1.first > o2.first? -1 : 1;
            }
        });

        PriorityQueue<pair> pq = new PriorityQueue<>(new Comparator<pair>() {
            @Override
            public int compare(pair o1, pair o2) {
                if (o1.first == o2.first && o2.second == o1.second) return 0;
                return o1.second*o1.first > o2.second*o2.first? -1 : 1;
            }
        });

        for (int i = 1; i <= n; i++) {
        int x=in.ni();int y=in.ni();
            pq.add(new pair(x, y));
            pq2.add(new pair(x, y));
            pq3.add(new pair(x, y));

        }

        long max = 0;
        long sum = 0, min = Integer.MAX_VALUE;
        long sum2=0,min2=Integer.MAX_VALUE;
        long sum3=0,min3= Integer.MAX_VALUE;

        while (k-- > 0 && !pq.isEmpty()) {
            pair temp = pq.poll();
            pair temp2=pq2.poll();
            pair temp3=pq3.poll();
            if (temp.second < min) min = temp.second;
            sum += temp.first;
            if (temp2.second < min2) min2 = temp2.second;
            sum2 += temp2.first;
            if (temp3.second < min3) min3 = temp3.second;
            sum3 += temp3.first;


            max = max > (sum * min) ? max : (sum * min);
            max = max > (sum2 * min2) ? max : (sum2 * min2);
            max = max > (sum3* min3) ? max : (sum3 * min3);
        }
        out.pr(max);
*/
        out.flush();
        out.close();
        in.close();
    }

    static long modpow(long x, long y, long MOD) {
        long res = 1;
        x = x % MOD;
        while (y > 0) {
            if (y % 2 == 1)
                res = (res * x) % MOD;
            x = (x * x) % MOD;
            y = y >> 1;
        }
        return res;
    }

    static long gcd(long a, long b) {
        return a == 0 ? b : gcd(b % a, a);
    }

    static Reader in = new Reader();
    static OutputWriter out = new OutputWriter(System.out);

    static class Reader {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public Reader() {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public Reader(String file_name) throws IOException {
            din = new DataInputStream(new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public String readLine() throws IOException {
            byte[] buf = new byte[64]; // line length
            int cnt = 0, c;
            while ((c = read()) != -1) {
                if (c == '\n')
                    break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public int ni() throws IOException {
            int ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (neg)
                return -ret;
            return ret;
        }

        public long nl() throws IOException {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nd() throws IOException {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();

            do {
                ret = ret * 10 + c - '0';
            } while ((c = read()) >= '0' && c <= '9');

            if (c == '.') {
                while ((c = read()) >= '0' && c <= '9') {
                    ret += (c - '0') / (div *= 10);
                }
            }

            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException {
            if (din == null)
                return;
            din.close();
        }
    }

    static class OutputWriter {
        private final PrintWriter writer;

        public OutputWriter(OutputStream outputStream) {
            writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
        }

        public OutputWriter(Writer writer) {
            this.writer = new PrintWriter(writer);
        }

        public void pr(Object... objects) {
            for (int i = 0; i < objects.length; i++) {
                if (i != 0)
                    writer.print(' ');
                writer.print(objects[i]);
            }
        }

        public void prn(Object... objects) {
            pr(objects);
            writer.println();
        }

        public void close() {
            writer.close();
        }

        public void flush() {
            writer.flush();
        }

    }
    /*Template ends here*/
}