#include <bits/stdc++.h>
#define el '\n'
#define fi first
#define sec second
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define sz(v) (int)(v).size()
#define all(v) (v).begin(),(v).end()
#define FOR(i, a, b) for(int i = (a), _b = (b); i <= _b; i++)
#define REP(i, a, b) for(int i = (b), _a = (a); i >= _a; i--)
using namespace std;
const int MOD = 1e9 + 7;
const int inv2 = (MOD + 1) / 2;
inline int cong(ll x, ll y){
ll z = x + y;
while(z >= MOD) z -= MOD;
return z;
}
inline int nhan(ll x, ll y){
return (x * y) % MOD;
}
int tinh_tong(ll l, ll r){
ll one = (r - l + 1 + MOD) % MOD;
ll two = cong(l, r);
return nhan(nhan(one, two), inv2);
}
ll tinh(ll n){
ll first_pos = 1, res = 0;
while(first_pos <= n){
ll val = n / first_pos, last_pos;
if(!val) last_pos = n;
else last_pos = n / val;
res = cong(res, nhan(tinh_tong(first_pos, last_pos), val));
first_pos = last_pos + 1;
}
return res;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
ll l, r;
cin >> l >> r;
cout << (tinh(r) - tinh(l - 1)) + MOD % MOD;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGVsICdcbicKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlYyBzZWNvbmQKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHN6KHYpIChpbnQpKHYpLnNpemUoKQojZGVmaW5lIGFsbCh2KSAodikuYmVnaW4oKSwodikuZW5kKCkKI2RlZmluZSBGT1IoaSwgYSwgYikgZm9yKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA8PSBfYjsgaSsrKQojZGVmaW5lIFJFUChpLCBhLCBiKSBmb3IoaW50IGkgPSAoYiksIF9hID0gKGEpOyBpID49IF9hOyBpLS0pCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBpbnYyID0gKE1PRCArIDEpIC8gMjsKCmlubGluZSBpbnQgY29uZyhsbCB4LCBsbCB5KXsKICAgIGxsIHogPSB4ICsgeTsKICAgIHdoaWxlKHogPj0gTU9EKSB6IC09IE1PRDsKICAgIHJldHVybiB6Owp9CgppbmxpbmUgaW50IG5oYW4obGwgeCwgbGwgeSl7CiAgICByZXR1cm4gKHggKiB5KSAlIE1PRDsKfQoKaW50IHRpbmhfdG9uZyhsbCBsLCBsbCByKXsKICAgIGxsIG9uZSA9IChyIC0gbCArIDEgKyBNT0QpICUgTU9EOwogICAgbGwgdHdvID0gY29uZyhsLCByKTsKICAgIHJldHVybiBuaGFuKG5oYW4ob25lLCB0d28pLCBpbnYyKTsKfQoKbGwgdGluaChsbCBuKXsKICAgIGxsIGZpcnN0X3BvcyA9IDEsIHJlcyA9IDA7CgogICAgd2hpbGUoZmlyc3RfcG9zIDw9IG4pewogICAgICAgIGxsIHZhbCA9IG4gLyBmaXJzdF9wb3MsIGxhc3RfcG9zOwoKICAgICAgICBpZighdmFsKSBsYXN0X3BvcyA9IG47CiAgICAgICAgZWxzZSBsYXN0X3BvcyA9IG4gLyB2YWw7CgogICAgICAgIHJlcyA9IGNvbmcocmVzLCBuaGFuKHRpbmhfdG9uZyhmaXJzdF9wb3MsIGxhc3RfcG9zKSwgdmFsKSk7CgogICAgICAgIGZpcnN0X3BvcyA9IGxhc3RfcG9zICsgMTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7CgogICAgbGwgbCwgcjsKICAgIGNpbiA+PiBsID4+IHI7CgogICAgY291dCA8PCAodGluaChyKSAtIHRpbmgobCAtIDEpKSArIE1PRCAlIE1PRDsKfQo=