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;
//この問題を解きやすいように解釈すると
//0,1,2,3,...,nのうちs個(s=k~n+1)取った時を考えればよい
//またこの時の最大値、最小値は
//Min=0+1+...+(s-1)
//Max=(n-s+1)+...+n
//この間は全て存在する
//計算を省略するため連続する数の和の公式も使う
//f(l,r)=l+(l+1)+..+r=(l+r)(r-l+1)/2

class Program
{
    static readonly int M = (int)Math.Pow(10, 9) + 7;
    static void Main()
    {
        string[] In = Console.ReadLine().Split(' ');
        int n = int.Parse(In[0]);
        int k = int.Parse(In[1]);
        long max, min;
        long sum = 0;
        for (int i = k; i <= n + 1; i++)
        {
            max = Wa(n-i+1,n);
            min = Wa(0,i-1);
            sum += (max - min + 1);
            sum %= M;   
        }
        Console.WriteLine(sum);
    }
    //ここのlong l, long rに注意
    static long Wa(long l, long r)
    {
        return (l+r)*(r-l+1) / 2;
    }
}
//class Program
//{
//    static readonly int M = (int)Math.Pow(10, 9) + 7;
//    static void Main()
//    {
//        string[] In = Console.ReadLine().Split(' ');
//        int n = int.Parse(In[0]);
//        int k = int.Parse(In[1]);
//        int max, min;
//        long sum=0;
//        for(int i = k; i <= n + 1; i++)
//        {
//            max = 0;
//            for(int j = n - i + 1; j <= n; j ++)
//            {
//                max += j;
//            }
//            min = 0;
//            for(int j = 0; j <= i - 1; j++)
//            {
//                min += j;
//            }
//            sum += max - min+1;
//            sum %= M;
//        }
//        Console.WriteLine(sum);
//    }
//}