// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

typedef long long ll;

typedef pair<int, int> pii;

typedef pair<ll, ll> pll;

typedef pair<double, double> pdd;

const ll mod = 1e9 + 7;

//const ll mod = 998244353;

#define REP(i,n) for(int i=0;i<(int)n;++i)

//debug

#define dump(x)  cerr << #x << " = " << (x) << endl;

#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }

template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }

template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){

os << "(" << v.first << ", " << v.second << ")"; return os;

}

template<class T> ostream& operator << (ostream& os, const vector<T> v){

for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;

}

template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){

for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;

}

string num2bit(ll num, ll len){

    string bit = "";

    REP(i, len){

    bit += char('0'+(num>>i & 1));

    }

    return bit;

}



template <std::uint_fast64_t Modulus> class modint {

  // long long から modint を作るときは必ず正の数にしてからコンストラクタに入れること！ 

  // そうしないとバグります

  using u64 = std::uint_fast64_t;



public:

  u64 a;



  constexpr modint(const u64 x = 0) noexcept : a(x % Modulus) {}

  constexpr u64 &value() noexcept { return a; }

  constexpr const u64 &value() const noexcept { return a; }

  constexpr modint operator+(const modint rhs) const noexcept {

    return modint(*this) += rhs;

  }

  constexpr modint operator-(const modint rhs) const noexcept {

    return modint(*this) -= rhs;

  }

  constexpr modint operator*(const modint rhs) const noexcept {

    return modint(*this) *= rhs;

  }

  constexpr modint operator/(const modint rhs) const noexcept {

    return modint(*this) /= rhs;

  }

  constexpr modint &operator+=(const modint rhs) noexcept {

    a += rhs.a;

    if (a >= Modulus) {

      a -= Modulus;

    }

    return *this;

  }

  constexpr modint &operator-=(const modint rhs) noexcept {

    if (a < rhs.a) {

      a += Modulus;

    }

    a -= rhs.a;

    return *this;

  }

  constexpr modint &operator*=(const modint rhs) noexcept {

    a = a * rhs.a % Modulus;

    return *this;

  }

  constexpr modint &operator/=(modint rhs) noexcept {

    u64 exp = Modulus - 2;

    while (exp) {

      if (exp % 2) {

        *this *= rhs;

      }

      rhs *= rhs;

      exp /= 2;

    }

    return *this;

  }

};

using mint = modint<mod>;



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);





    ll N, K;

    cin >> N >> K;

    mint res = 0;



    for(int P=K;P<=N+1;P++){

        mint tmp1 = mint(P)*(P-1)/2;

        mint tmp2 = mint(N)*(N+1)/2;

        mint tmp3 = mint(N-P)*(N-P+1)/2;

        mint tmp4 = tmp2 - tmp3;

        //dump(tmp1.value())

        //dump(tmp4.value())



        res += (tmp2-tmp3) - tmp1 + 1;

    }

    cout << res.value() << endl;



    return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.5754106182346814x):
#include <bits/stdc++.h>

using namespace std;



typedef unsigned long long ull;

typedef long long ll;

typedef pair<int, int> pii;

typedef pair<ll, ll> pll;

typedef pair<double, double> pdd;

//typedef vector<vector<ll>> Graph;



const ll mod = 1e9 + 7;

//const ll mod = 998244353;



#define REP(i,n) for(ll i=0;i<(ll)n;i++)

#define dump(x)  cerr << #x << " = " << (x) << endl;

#define spa << " " <<

#define fi first

#define se second



template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }

template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }



template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){

os << "(" << v.first << ", " << v.second << ")"; return os;

}

template<class T> ostream& operator << (ostream& os, const vector<T> v){

for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << " ";} os << v[i];} return os;

}

template<class T> ostream& operator << (ostream& os, const vector<vector<T>> v){

for(int i = 0; i < (int)v.size(); i++){if(i > 0){os << endl;} os << v[i];} return os;

}



template<typename T> void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++)

{cerr<<v[i][0];for(ll j=1;j<w;j++)cerr spa v[i][j];cerr<<endl;}};

template<typename T> void debug(vector<T>&v,ll n){if(n!=0)cerr<<v[0];

for(ll i=1;i<n;i++)cerr spa v[i];

cerr<<endl;};



string num2bit(ll num, ll len){

    string bit = "";

    REP(i, len){

    bit += char('0'+(num>>i & 1));

    }

    return bit;

}



int main(){

    cin.tie(0);

    ios::sync_with_stdio(false);



    ll N, K;

    cin >> N >> K;

    ll res = 0;

    for(int k=K;k<=N+1;k++){

        ll tmp = k*(N-k+1)+1;

        tmp %= mod;

        res += tmp;

        res %= mod;

    }

    cout << res << endl;



    return 0;

}