Problem:
Score : 400 points

Problem Statement

For an integer N, we will choose a permutation \{P_1, P_2, ..., P_N\} of \{1, 2, ..., N\}.

Then, for each i=1,2,...,N, let M_i be the remainder when i is divided by P_i.

Find the maximum possible value of M_1 + M_2 + \cdots + M_N.

Constraints

N is an integer satisfying 1 \leq N \leq 10^9.

Input

Input is given from Standard Input in the following format:

N

Output

Print the maximum possible value of M_1 + M_2 + \cdots + M_N.

Sample Input 1

2

Sample Output 1

1

When the permutation \{P_1, P_2\} = \{2, 1\} is chosen, M_1 + M_2 = 1 + 0 = 1.

Sample Input 2

13

Sample Output 2

78

Sample Input 3

1

Sample Output 3

0

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


// Java program For handling Input/Output 
import java.io.*; 
import java.util.*;
import java.math.*;

public class Main 
{ 
    Scanner sc;

//actual logic
    void solve(){
        int n = ni();

        int sum = n * (n - 1) / 2;

        if(n == 2)
            System.out.println(1);
        else
            System.out.println(n%2 == 1 ? sum:sum-1);

    }

//constructor
    Main(){
        try{  
            sc = new Scanner(System.in);
        }catch(Exception e){
            System.out.println(e);
        }
    }


//main metohd
    public static void main(String[] args) 
    { 
    	new Main().solve();
    }


//Utility methods
    //input an integer from scanner
    int ni()
    {
        int a = sc.nextInt();
        return a;
    }
    //input a long from scanner
    long nl()
    {
        return sc.nextLong();
    }
    //input a float from scanner
    float nf(){
        float a = sc.nextFloat();
        return a;
    }
    //input a double from scanner
    double nd(){
        double a = sc.nextDouble();
        return a;
    }
    //input a sentence from scanner
    String ns(){
        return sc.nextLine();
    }
    //converts a string to stringtokenizer
    StringTokenizer nst(String s){
        return new StringTokenizer(s);
    }
    //input an intger array
    void ia(int a[]){
        for(int i = 0;i < a.length;i++)
            a[i] = sc.nextInt();
    }
    //
    void la(long a[]){
        for(int i = 0;i < a.length;i++)
            a[i] = sc.nextLong();
    }
    //input a float array
    void fa(float a[]){
        for(int i = 0;i < a.length;i++)
            a[i] = sc.nextFloat();
    }
    //input a double array
    void da(double a[]){
        for(int i = 0;i < a.length;i++)
            a[i] = sc.nextDouble();
    }
    //input a string array either with all empty input or from scanner
    void sa(String a[], boolean empty){
        if(empty)
        {
            for(int i = 0;i < a.length;i++)
            {
                a[i] = "";
            }
        }
        else
        {
            for(int i = 0;i < a.length;i++)
            {
                a[i] = ns();
            }
        }
    }
    //input two dimensional integer array
    void ida(int a[][], int n, int m)
    {
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < m;j++)
            {
                a[i][j] = ni();
            }
        }
    }
    //input two dimentional long array
    void lda(long a[][], int n, int m)
    {
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < m;j++)
            {
                a[i][j] = nl();
            }
        }
    }
    //input two dimensional double array
    void dda(double a[][], int n, int m)
    {
        for(int i = 0;i < n;i++)
        {
            for(int j = 0;j < m;j++)
            {
                a[i][j] = nd();
            }
        }
    }
    //convert string to integer
    int stoi(String s){
        return Integer.parseInt(s);
    }
    //convert string to double
    double stod(String s){
        return Double.parseDouble(s);
    }
    //find minimum in a long array
    long lmin(long a[])
    {
        long min = Long.MAX_VALUE;
        for(int i = 0;i < a.length;i++)
        {
            if(min > a[i])
                min = a[i];
        }
        return min;
    }
    //find minimum in a integer array
    int imin(int a[])
    {
        int min = Integer.MAX_VALUE;
        for(int i = 0;i < a.length;i++)
        {
            if(min > a[i])
                min = a[i];
        }
        return min;
    }
    //find maximum in a long array
    long lmax(long a[])
    {
        long max = Long.MIN_VALUE;
        for(int i = 0;i < a.length;i++)
        {
            if(max < a[i])
                max = a[i];
        }
        return max;
    }
    //find maximum in an integer array
    int imax(int a[])
    {
        int max = Integer.MIN_VALUE;
        for(int i = 0;i < a.length;i++)
        {
            if(max < a[i])
                max = a[i];
        }
        return max;
    }
    //check whether an element is present in an integer array by binary search
    boolean ibs(int a[], int toFind)
    {
        Arrays.sort(a);
        int min = 0;
        int max = a.length-1;
        boolean found = false;

        while(min <= max && !found)
        {
            int mid = min + (max-min)/2;
            if(a[mid] == toFind)
            {
               found = true;
            }
            else if(toFind > a[mid])
            {
                min = mid+1;
            }
            else
            {
                max = mid-1;
            }

        }
        return found;
    }
    //check whether an element is present in a long array
    boolean lbs(long a[], long toFind)
    {
        Arrays.sort(a);
        int min = 0;
        int max = a.length-1;
        boolean found = false;

        while(min <= max && !found)
        {
            int mid = min + (max-min)/2;
            if(a[mid] == toFind)
            {
               found = true;
            }
            else if(toFind > a[mid])
            {
                min = mid+1;
            }
            else
            {
                max = mid-1;
            }

        }
        return found;
    }

    int stb(String s)
    {
        int sum = 0;
        int k = 0;
        for(int i = s.length()-1;i >= 0;i--)
        {
            sum += stoi(s.charAt(i)+"") * Math.pow(2, k++);
        }
        return sum;
    }

}