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 (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>

#define LIMIT 1000000007
typedef long long LL;

LL summax(LL k, LL max);
LL summin(LL k){
    //0~k-1の和
    
    LL ans = ((k-1)*k);
    ans /= 2;
    //printf("summin(%lld) = %lld\n", k, ans);
    
    //オーバーフローするので~k-1, k項の和と考えると
    //LL ans = summax(k, k-1);
    //オーバーフローした
    //初項0なので、~k-1, k-1項の和と考えると
    //LL ans = summax(k-1, k-1);
    //同様にオーバーフローした
    /*LL ans = 0;
    for(int i=0; i<=k-1; i++){
        ans += i;
    }
    printf("summin(%lld) = %lld\n", k, ans);
    */
    return ans;
}

LL summax(LL k, LL max){
    //~max,k項の和
    LL ans = 2*max;
    ans = (ans-k+1);
    ans = ans*k;
    ans /= 2;
  	//%LIMITを消した
    //printf("summax(%lld, %lld) = %lld\n", k, max, ans);
    return ans;
}

int main(){
    LL N, K, k;
    scanf("%lld%lld", &N, &K);
    LL ans = 0, buf;
    for(k=K; k<=N+1; k++){
        buf = summax(k, N) - summin(k) + 1;
        //buf %= LIMIT;
        ans += buf;
        ans %= LIMIT;
    }
    printf("%lld\n", ans);
    return 0;
}