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 C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

namespace D
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine().Split(' ').Select(s => int.Parse(s)).ToArray();
            long N = input[0] + 1;
            long K = input[1];

            var acum = new long[N];
            acum[0] = N - 1;
            for(int i = 1; i < N; i++)
            {
                acum[i] = acum[i - 1] + N - i - 1;
            }

            var acum2 = new long[N];
            acum2[0] = 0;
            for(int i = 1; i < N; i++)
            {
                acum2[i] += acum2[i - 1] + i;
            }

            long result = 0;
            for(int i = 0; i < N; i++)
            {
                result = ModAdd(result, acum[i] - acum2[i] + 1);
            }

            long minus = 0;
            for(int i = 0; i < K - 1; i++)
            {
                minus = ModAdd(minus, acum[i] - acum2[i] + 1);
            }

            Console.WriteLine($"{ModMinus(result, minus)}");
        }

        static long ModAdd(long a, long b)
        {
            return (a + b) % 1000000007;
        }

        static long ModMinus(long a, long b)
        {
            var c = a - b;

            if (a - b < 0)
            {
                return (c + 1000000007) % 1000000007; 
            }

            return c % 1000000007;
        }
    }
}