#include <bits/stdc++.h>
#include<algorithm>
#include<map>
#include <vector>
#include<stack>
#include<cstring>

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
using namespace std;
#define ll long long
#define ld long double
#define vll vector<ll>
#define vpll vector<pair<ll ,ll > >
#define pb push_back
#define MOD 1000000007
#define inf 100000000000000000
#define ios ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define all(v) v.begin(),v.end()
#define fst first
#define scd second
#define fr(i,n) for(ll (i) = 0 ; (i) < (n) ; ++(i))
#define fr1(i,n) for(ll (i) = 1 ; (i) <= (n) ; ++(i))
#define frr(i,n) for(ll (i) = (n)-1 ; (i)>=0 ; --(i))
#define frab(i,a,b,c) for(ll (i) = a ; (i) < (b) ; (i)+=(c))
#define print(v) for( auto it: v) cout<<it<<" "
#define mst(A) memset( (A) , 0 , sizeof(A) )


//////////////////////////////////////////////////////////////////////////
//------------------TRACE--------------------------------//
template<class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
    os << "(" << p.first << ", " << p.second << ")";
    return os;
}

template<class T>
ostream& operator <<(ostream& os, const vector<T>& v) {
    os << "{";
    for (int i = 0; i < (int)v.size(); i++) {
        if (i)os << ", ";
        os << v[i];
    }
    os << "}";
    return os;
}

#ifdef LOCAL
#define cerr cout
#else
#endif

#define TRACE

#ifdef TRACE
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
    cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
    const char* comma = strchr(names + 1, ','); cerr.write(names, comma - names) << " : " << arg1 << " | "; __f(comma + 1, args...);
}
#else
#define trace(...)
#endif
//////////////////////////////////////////////////////

bool cmp(const pair<ll, ll> &a, const pair<ll, ll> &b)
{
    if (a.first == b.first)
        return (a.scd >= b.scd);
    return (a.first < b.first);
}
vll primes;
vll seive;
void Seive(ll n) {
    seive.resize(n + 5, 1);
    seive[1] = 0, seive[0] = 0;
    for ( int i = 2; i * i < n + 5; i++) {
        if (seive[i]) {
            for (int j = 2 * i; j < n + 5; j += i) {
                seive[j] = 0;
            }
        }
    }
}
ll power(ll x, ll y , ll m = MOD) {
    long long int res = 1;
    x = x % m;
    while (y > 0) {
        if (y & 1)
            res = (res * x) % m;
        y = y >> 1;
        x = (x * x) % m;
    }
    return res;
}
ll modinv(ll x , ll mod = MOD) {
    return power(x , mod - 2 , mod);
}
int n, m;
ll A[300060];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
#ifndef ONLINE_JUDGE
    freopen("/home/aman/Documents/compwtitive_coding/Competitive-coding-codes/in.txt", "r", stdin);
    freopen("/home/aman/Documents/compwtitive_coding/Competitive-coding-codes/out.txt", "w", stdout);
#endif
    int  k, t, a, b, c, d;
    t = 1;
    // cin >> t;
    while (t--) {

        cin >> n >> m;
        // cin >> n;
        ll ans = 0;
        n++;
        // Comment the above line  before array input
        for ( ll i = n; i >= m; i--) {
            ll x = (i * (n - i)  ) % MOD;
            x++;
            x %= MOD;
            ans = ans + x % MOD;
            ans %= MOD;
        }
        cout << ans << endl;


    }

}








Measured memory_bytes: 3668