#include<bits/stdc++.h>
using namespace std;
#define ll long long int
typedef unsigned long long int ull;
typedef long double ldb;
#define mod 1000000007
#define rep(i,a,b) for(ll i=a;i<b;i++)
#define repi(i,a,b) for(ll i=b-1;i>=a;i--)
#define MT make_tuple
#define G(a,b) get<a>(b)
#define VI vector<int>
#define VLL vector<long long int>
#define pb push_back
#define mp make_pair
#define sz size()
#define ani ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
/*SOME BITMASK KNOWLEDGE
1)x & (x - 1):sets the last one bit of x to zero
power of two exactly when x & (x − 1) = 0.
2)x & -x:sets all the one bits to zero, except last one bit
3)x | (x - 1):inverts all the bits after the last one bit
4)(a^b) = (a|b)-(a&b) = (a+b-2*(a&b))
5)(a+b) = a^b + 2*(a&b)
6)   lowest set bit of N =n ^ ( n & (n-1));
7)    Turn off 1st set bit= n^(n&(-n));
8) clear all bits from MSB to ith bit  = n&((1<<i)-1);    
9) clear all bits from LSB= n&(~((1<<(i+1))-1))      
10) if a%m<0 then compute (a%m+m)%m  
11) int __builtin_ffs (int x) Returns one plus the index of the least significant 1-bit of x, or if x is zero, returns zero. 
12) int __builtin_clz (unsigned int x)  Returns the number of leading 0-bits in x, starting at the most significant bit position. If x is 0, the result is undefined.
13)  int __builtin_ctz (unsigned int x)    Returns the number of trailing 0-bits in x, starting at the least significant bit position. If x is 0, the result is undefined.
14)   __builtin_popcountl()
15)  __builtin_parityl()  Returns the parity of x, i.e. the number of 1-bits in x modulo 2.
16) __builtin_ctz(x) returns number of trailing 0-bits of x which starts from least significant bit position if x == 0, returns an undefined value.
 17)  for any two relatively prime positive integers m,nm,n, the greatest integer that cannot be written in the form am + bnam+bn for nonnegative integers a, ba,b is \ mn-m-n mn−m−n  */

const int maxn = 2e5 + 42;
#define endl "\n"


ll gcd(ll  a, ll  b) { 
   if (b == 0) 
      return a; 
   return gcd(b, a % b);  
} 
 
ll lcm(ll a, ll b){ 
    return (a*b)/(gcd(a, b));
}
ll max(ll a, ll b){
  if (a > b)
    return a;
  return b;
}

 
ll bins(ll ar[],ll l,ll r,ll x) 
{ 
    if (r >= l) { 
        ll mid =l+((r-l)/2); 
        if(ar[mid]==x) 
            return mid; 
        if(ar[mid]>x) 
            return bins(ar,l,mid-1,x);
        return bins(ar,mid+1,r,x); 
    } 
    return -1; 
} 

 
 
 ll decimalToBinary(ll N) 
{ 
  
    // To store the binary number 
    ll B_Number = 0; 
    ll cnt = 0; 
    while (N != 0) { 
        ll rem = N % 2; 
        ll c = pow(10, cnt); 
        B_Number += rem * c; 
        N /= 2; 
  
        // Count used to store exponent value 
        cnt++; 
    } 
  
    return B_Number; 
} 


int countFreq(string &pat, string &txt) 
{ 
    int M = pat.length(); 
    int N = txt.length(); 
    int res = 0; 
    
    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= N - M; i++) 
    {  
        /* For current index i, check for  
           pattern match */
        int j; 
        for (j = 0; j < M; j++) 
            if (txt[i+j] != pat[j]) 
                break; 
   
        // if pat[0...M-1] = txt[i, i+1, ...i+M-1] 
        if (j == M)   
        {  
           res++; 
           j = 0; 
        } 
    } 
    return res; 
} 


int lis(int a[],int n)
{
    int b[n];
    b[0]=1;
    for (int i = 1; i < n; ++i)
    {
        b[i]=1;
    for(int j=i-1;j>=0;j--)
    {
        if(a[j]>a[i])
            continue;
        int p=b[j]+1;
        if(p>a[i])
            a[i]=p;
    }
    }
    int best=0;
    for (int i = 0; i < n; i++) {
        if (best < b[i]) {
            best = b[i];
        }
    }
return best;
}



int count_ways_to_make_change(int s[],int m,int n)
{
    int i,j,x,y;
    int table[n+1][m];

for( i=0;i<m;i++)
{ table[0][i]=1;
}

for(i=1;i<n+1;i++)
{
    for(j=0;j<m;j++)
    {
        x= (i-s[j]>=0) ? table[i-s[j]][j] : 0; //count of sols including s[j]
        y= (j>=1) ? table[i][j-1] : 0; // count of sols excluding s[j]

        table[i][j]=x+y;  //total count
    }

}
return table[n][m-1];

}


ll kadane(ll a[],ll n)
{
    ll curr=0;
    ll best=0;
    for(ll i=0;i<n;i++)
    {
        curr+=a[i];
        if(best<curr)
        {
            best=curr;
        }
        if(curr<0)
            curr=0;
    }
    return best;
}

int maxSum(int arr[], int n, int k) //maximum sum of a subarray of size k
{ 
    if (n < k) 
    { 
       cout << "Invalid"; 
       return -1; 
    } 

    int res = 0; 
    for (int i=0; i<k; i++) 
       res += arr[i]; 

    int curr_sum = res; 
    for (int i=k; i<n; i++) 
    { 
       curr_sum += arr[i] - arr[i-k]; 
       res = max(res, curr_sum); 
    } 
  
    return res; 
} 
  

int bpow(int x, int n) 
{    return n ? n % 2 ? 1LL * x * bpow(x, n - 1) % mod : bpow(1LL * x * x % mod, n / 2) : 1;
}
int inv(int x)
{    return bpow(x, mod - 2);
}
int F[maxn];
int fact(int n)
{    return n ? F[n] ? F[n] : F[n] = 1LL * n * fact(n - 1) % mod : 1;
}
int rfact(int n) 
{    return inv(fact(n));
}
int nCr(int n, int r) 
{    return 1LL * fact(n) * rfact(r) % mod * rfact(n - r) % mod;
}
 
 
ll modmul(ll a, ll b, ll m){
 
    return ((a%m)*(b%m))%m;
}
 

 
ll modsum(ll a, ll b, ll m){
 
    return ((a%m)+(b%m))%m;
}
 

int main()
{ 
ani;
    
   ll t=1; 
   // cin>>t;

    while(t--)
    {   

ll n,k;
cin>>n>>k;

ll a[n+1];
ll h=n;
for(int i=0;i<=n;i++)
{   a[i]=h;
    h--;
}
for(int i=1;i<=n;i++)
{   a[i]=modsum(a[i-1],a[i],mod);
}

ll b[n+1];
for(int i=0;i<=n;i++)
{   b[i]=i;
}

for(int i=1;i<=n;i++)
{    b[i]=modsum(b[i-1],b[i],mod);
}

ll s=0;
for(int i=k-1;i<=n;i++)
{
     ll temp=(a[i]-b[i]+1ll+mod)%mod;
    s=modsum(s,temp,mod);
}


cout<<s;





    }
       
    

 


return 0;
}

Measured memory_bytes: 6788