#include <bits/extc++.h>
#define endl '\n'
typedef long long ll;
#define int ll
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
constexpr int mod = 20101009;
void Main() {
int n, m;
cin >> n >> m;
int lim = min(n, m);
vector<int> primes;
vector<bool> notprime(lim + 1);
vector<int> sum(lim + 1);
sum[1] = 1;
for (int i = 2; i <= lim; ++i) {
if (!notprime[i]) {
primes.push_back(i);
sum[i] = (-(i * i % mod) + mod) % mod;
}
for (int p : primes) {
if (i * p > lim) {
break;
}
notprime[i * p] = true;
if (i % p == 0) {
sum[i * p] = 0;
break;
}
sum[i * p] = sum[i] * sum[p] % mod;
}
}
for (int i = 1; i <= lim; ++i) {
sum[i] = (sum[i] + sum[i - 1]) % mod;
}
auto getsum = [&](int x) {
return x * (x + 1) / 2 % mod;
};
auto calc = [&](int a, int b) {
int res = 0;
int bound = min(a, b);
for (int l = 1, r; l <= bound; l = r + 1) {
r = min(a / (a / l), b / (b / l));
int s1 = getsum(a / l);
int s2 = getsum(b / l);
int term = (sum[r] - sum[l - 1] + mod) % mod;
res = (res + term * s1 % mod * s2) % mod;
}
return res;
};
int res = 0;
for (int l = 1, r; l <= lim; l = r + 1) {
r = min(n / (n / l), m / (m / l));
int sumd = (l + r) * (r - l + 1) / 2 % mod;
res = (res + sumd * calc(n / l, m / l)) % mod;
}
cout << (res % mod + mod) % mod << endl;
}
//#define CP_MULTI_TEST_CASES
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t = 1;
#ifdef CP_MULTI_TEST_CASES
cin >> t;
#endif
while (t--) {
Main();
}
return cout << flush, fflush(stdout), 0;
}