#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
#define int long long
const int N = 1e6 + 5;
const int MOD = 1e9 + 7;
int l, r, ans = 0;
int POW10[19];
void add(int &u, int v) {
u += v;
if (u >= MOD) u -= MOD;
}
vector<int> primes;
bool isPrime[N];
void sieve(int n) {
for (int i = 2; i <= n; i++) if (!isPrime[i]) {
primes.push_back(i);
for (int j = i * i; j <= n; j += i) isPrime[j] = 1;
}
}
int getLen(int a) {
int len = 0;
while(a) {
len ++;
a /= 10;
}
return len;
}
namespace sub1 {
int calc(int p1, int p2) {
int base = POW10[getLen(p1)];
int tx = 1;
while(1) {
if ((tx * base + p1) % p2 == 0) break;
tx++;
}
return ((tx * base) % MOD + p1) % MOD;
}
void solve() {
for (int i = 1; i < primes.size(); i++) {
int p1 = primes[i - 1], p2 = primes[i];
if (p1 < l || p2 > r) continue;
add(ans, calc(p1, p2));
}
cout << ans;
}
};
inline int MUL(int a, int p, int mod) {
int ans = 0;
for (; p > 0; p >>= 1, a = a * 2 % mod) if (p & 1) ans = (ans + a) % mod;
return ans;
}
inline int POW(int a, int p, int mod) {
int ans = 1 % mod;
for (; p > 0; p >>= 1, a = MUL(a, a, mod)) if (p & 1) ans = MUL(ans, a, mod);
return ans;
}
inline int gcdex(int a, int b, int c) {
int x = c * POW(a, b - 2, b);
int rem = x / b;
x = x - rem * b;
return x;
}
inline int calc(int p1, int p2) {
int a = POW10[getLen(p1)];
int c = p2 - p1;
int x = gcdex(a, p2, c);
// cerr << x << " " << a << '\n';
return (MUL(x, a, MOD) + p1) % MOD;
}
namespace subfull {
bool nok[N];
void solve() {
memset(nok, 0, sizeof(nok));
for (int p: primes) {
for (int i = ((l + p - 1) / p) * p; i <= r; i += p) {
if (i != p) nok[i - l] = 1;
}
}
vector<int> newPrimes;
for (int i = l; i <= r; i++) {
if (!nok[i - l]) newPrimes.push_back(i);
}
// for (int i: newPrimes) cerr << i << " "; cerr << "\n";
for (int i = 1; i < newPrimes.size(); i++) {
int p1 = newPrimes[i - 1], p2 = newPrimes[i];
if (p1 < l || p2 > r) continue;
add(ans, calc(p1, p2));
}
cout << ans;
}
};
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("SUFPRI.inp")) {
freopen("SUFPRI.inp", "r", stdin);
freopen("SUFPRI.out", "w", stdout);
}
sieve(1000001);
POW10[0] = 1; for (int i = 1; i <= 18; i++) POW10[i] = POW10[i - 1] * 10;
cin >> l >> r;
if (r <= 1000) return sub1::solve(), 0;
return subfull::solve(), 0;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZnQgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKI2RlZmluZSBpbnQgbG9uZyBsb25nCmNvbnN0IGludCBOID0gMWU2ICsgNTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmludCBsLCByLCBhbnMgPSAwOwppbnQgUE9XMTBbMTldOwp2b2lkIGFkZChpbnQgJnUsIGludCB2KSB7CiAgICB1ICs9IHY7CiAgICBpZiAodSA+PSBNT0QpIHUgLT0gTU9EOwp9CnZlY3RvcjxpbnQ+IHByaW1lczsKYm9vbCBpc1ByaW1lW05dOwp2b2lkIHNpZXZlKGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMjsgaSA8PSBuOyBpKyspIGlmICghaXNQcmltZVtpXSkgewogICAgICAgIHByaW1lcy5wdXNoX2JhY2soaSk7CiAgICAgICAgZm9yIChpbnQgaiA9IGkgKiBpOyBqIDw9IG47IGogKz0gaSkgaXNQcmltZVtqXSA9IDE7CiAgICB9Cn0KCmludCBnZXRMZW4oaW50IGEpIHsKICAgIGludCBsZW4gPSAwOwogICAgd2hpbGUoYSkgewogICAgICAgIGxlbiArKzsKICAgICAgICBhIC89IDEwOwogICAgfQogICAgcmV0dXJuIGxlbjsKfQoKbmFtZXNwYWNlIHN1YjEgewppbnQgY2FsYyhpbnQgcDEsIGludCBwMikgewogICAgaW50IGJhc2UgPSBQT1cxMFtnZXRMZW4ocDEpXTsKICAgIGludCB0eCA9IDE7CiAgICB3aGlsZSgxKSB7CiAgICAgICAgaWYgKCh0eCAqIGJhc2UgKyBwMSkgJSBwMiA9PSAwKSBicmVhazsKICAgICAgICB0eCsrOwogICAgfQogICAgcmV0dXJuICgodHggKiBiYXNlKSAlIE1PRCArIHAxKSAlIE1PRDsKfQp2b2lkIHNvbHZlKCkgewogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwcmltZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICBpbnQgcDEgPSBwcmltZXNbaSAtIDFdLCBwMiA9IHByaW1lc1tpXTsKICAgICAgICBpZiAocDEgPCBsIHx8IHAyID4gcikgY29udGludWU7CiAgICAgICAgYWRkKGFucywgY2FsYyhwMSwgcDIpKTsKICAgIH0KICAgIGNvdXQgPDwgYW5zOwp9Cn07CmlubGluZSBpbnQgTVVMKGludCBhLCBpbnQgcCwgaW50IG1vZCkgewogICAgaW50IGFucyA9IDA7CiAgICBmb3IgKDsgcCA+IDA7IHAgPj49IDEsIGEgPSBhICogMiAlIG1vZCkgaWYgKHAgJiAxKSBhbnMgPSAoYW5zICsgYSkgJSBtb2Q7CiAgICByZXR1cm4gYW5zOwp9CmlubGluZSBpbnQgUE9XKGludCBhLCBpbnQgcCwgaW50IG1vZCkgewogICAgaW50IGFucyA9IDEgJSBtb2Q7CiAgICBmb3IgKDsgcCA+IDA7IHAgPj49IDEsIGEgPSBNVUwoYSwgYSwgbW9kKSkgaWYgKHAgJiAxKSBhbnMgPSBNVUwoYW5zLCBhLCBtb2QpOwogICAgcmV0dXJuIGFuczsKfQoKaW5saW5lIGludCBnY2RleChpbnQgYSwgaW50IGIsIGludCBjKSB7CiAgICBpbnQgeCA9IGMgKiBQT1coYSwgYiAtIDIsIGIpOwogICAgaW50IHJlbSA9IHggLyBiOwogICAgeCA9IHggLSByZW0gKiBiOwogICAgcmV0dXJuIHg7Cn0KaW5saW5lIGludCBjYWxjKGludCBwMSwgaW50IHAyKSB7CiAgICBpbnQgYSA9IFBPVzEwW2dldExlbihwMSldOwogICAgaW50IGMgPSBwMiAtIHAxOwogICAgaW50IHggPSBnY2RleChhLCBwMiwgYyk7CiAgICAvLyBjZXJyIDw8IHggPDwgIiAiIDw8IGEgPDwgJ1xuJzsKICAgIHJldHVybiAoTVVMKHgsIGEsIE1PRCkgKyBwMSkgJSBNT0Q7Cn0KCm5hbWVzcGFjZSBzdWJmdWxsIHsKYm9vbCBub2tbTl07CnZvaWQgc29sdmUoKSB7CiAgICBtZW1zZXQobm9rLCAwLCBzaXplb2Yobm9rKSk7CiAgICBmb3IgKGludCBwOiBwcmltZXMpIHsKICAgICAgICBmb3IgKGludCBpID0gKChsICsgcCAtIDEpIC8gcCkgKiBwOyBpIDw9IHI7IGkgKz0gcCkgewogICAgICAgICAgICBpZiAoaSAhPSBwKSBub2tbaSAtIGxdID0gMTsKICAgICAgICB9CiAgICB9CiAgICB2ZWN0b3I8aW50PiBuZXdQcmltZXM7CiAgICBmb3IgKGludCBpID0gbDsgaSA8PSByOyBpKyspIHsKICAgICAgICBpZiAoIW5va1tpIC0gbF0pIG5ld1ByaW1lcy5wdXNoX2JhY2soaSk7CiAgICB9CiAgICAvLyBmb3IgKGludCBpOiBuZXdQcmltZXMpIGNlcnIgPDwgaSA8PCAiICI7IGNlcnIgPDwgIlxuIjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbmV3UHJpbWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgaW50IHAxID0gbmV3UHJpbWVzW2kgLSAxXSwgcDIgPSBuZXdQcmltZXNbaV07CiAgICAgICAgaWYgKHAxIDwgbCB8fCBwMiA+IHIpIGNvbnRpbnVlOwogICAgICAgIGFkZChhbnMsIGNhbGMocDEsIHAyKSk7CiAgICB9CiAgICBjb3V0IDw8IGFuczsKfQp9OwpzaWduZWQgbWFpbigpIHsKICAgIGNpbi50aWUoTlVMTCktPnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBpZihpZnN0cmVhbSgiU1VGUFJJLmlucCIpKSB7CiAgICAgICAgZnJlb3BlbigiU1VGUFJJLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIlNVRlBSSS5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBzaWV2ZSgxMDAwMDAxKTsKICAgIFBPVzEwWzBdID0gMTsgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTg7IGkrKykgUE9XMTBbaV0gPSBQT1cxMFtpIC0gMV0gKiAxMDsKICAgIGNpbiA+PiBsID4+IHI7CiAgICBpZiAociA8PSAxMDAwKSByZXR1cm4gc3ViMTo6c29sdmUoKSwgMDsKICAgIHJldHVybiBzdWJmdWxsOjpzb2x2ZSgpLCAwOwogICAgcmV0dXJuIDA7Cn0=