Problem:
Score : 400 points

Problem Statement

We have N+1 integers: 10^{100}, 10^{100}+1, ..., 10^{100}+N.

We will choose K or more of these integers. Find the number of possible values of the sum of the chosen numbers, modulo (10^9+7).

Constraints

1 \leq N \leq 2\times 10^5

1 \leq K \leq N+1

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the number of possible values of the sum, modulo (10^9+7).

Sample Input 1

3 2

Sample Output 1

10

The sum can take 10 values, as follows:

(10^{100})+(10^{100}+1)=2\times 10^{100}+1

(10^{100})+(10^{100}+2)=2\times 10^{100}+2

(10^{100})+(10^{100}+3)=(10^{100}+1)+(10^{100}+2)=2\times 10^{100}+3

(10^{100}+1)+(10^{100}+3)=2\times 10^{100}+4

(10^{100}+2)+(10^{100}+3)=2\times 10^{100}+5

(10^{100})+(10^{100}+1)+(10^{100}+2)=3\times 10^{100}+3

(10^{100})+(10^{100}+1)+(10^{100}+3)=3\times 10^{100}+4

(10^{100})+(10^{100}+2)+(10^{100}+3)=3\times 10^{100}+5

(10^{100}+1)+(10^{100}+2)+(10^{100}+3)=3\times 10^{100}+6

(10^{100})+(10^{100}+1)+(10^{100}+2)+(10^{100}+3)=4\times 10^{100}+6

Sample Input 2

200000 200001

Sample Output 2

1

We must choose all of the integers, so the sum can take just 1 value.

Sample Input 3

141421 35623

Sample Output 3

220280457

Solution in Java (OpenJDK 11.0.6) (judge verdict: Accepted)

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int N;
        int K;
        int MOD_VAL = 1_000_000_007;

        try (Scanner sc = new Scanner(System.in)) {
            N = sc.nextInt();
            K = sc.nextInt();
        }
        long[] mae = new long[N+1];
        long[] ushi = new long[N+1];

        mae[0] = 0;
        for (int i = 1; i < N+1; i++) {
            mae[i] = (mae[i -1]% MOD_VAL + i% MOD_VAL) % MOD_VAL;
        }

        ushi[N] = N;
        for (int i = N-1; i >= 0; i--) {
            ushi[i] = (ushi[i+1]% MOD_VAL + i% MOD_VAL) % MOD_VAL;

        }
        //System.out.println(Arrays.toString(mae));
        //System.out.println(Arrays.toString(ushi));
        long result = 0;
        for (int i = K; i <= N + 1; i++) {
            long temp = ushi[(N+1) -i]% MOD_VAL - (long)(mae[i -1]% MOD_VAL -1);
            if(temp < 0){
                temp = (MOD_VAL + temp) % MOD_VAL;
            }
            temp = temp% MOD_VAL;
            //System.out.println(temp);
            result += temp;
            result = result % MOD_VAL;
        }
        System.out.println(result);
    }

}