#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
using ll = long long;
const int N = 1e7 + 5;
int n, m;
ll euler[N];
ll ans = 0;
bool prime[N];
int p[N];
namespace sub1 {
void solve() {
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (__gcd(i, j) == 1) ans++;
cout << ans;
}
};
namespace sub2 {
void sieve_euler_phi(){
for (int i = 0; i <= n; i++) euler[i] = i;
prime[0] = prime[1] = 1;
for (int i = 2; i * i <= n; i++){
if (!prime[i]){
for (int j = i * i; j <= n; j += i){
prime[j] = true;
}
}
}
for (int i = 1; i <= n; i++){
if (!prime[i]){
for (int j = i; j <= n; j += i){
euler[j] -= euler[j] / i;
}
}
}
euler[1] = 1;
}
void solve() {
sieve_euler_phi();
for (int i = 1; i <= n; i++) ans += euler[i];
ans = ans * 2 - 1;
cout << ans;
}
};
namespace subfull {
void sieve_prime() {
prime[0] = prime[1] = 1;
for (int i = 1; i <= n; i++) p[i] = i;
for (int i = 2; i * i <= n; i++){
if (!prime[i]) {
for (int j = i * i; j <= n; j += i) {
prime[j] = true;
p[j] = min(i, p[j]);
}
}
}
}
inline int calc(int x) {
int cnt = 0, pre = -1;
while (x != 1) {
int t = p[x];
if (t == pre) return -1;
x /= t;
cnt++;
pre = t;
}
return cnt;
}
void sieve(){
for (int i = 1; i <= n; i++) euler[i] = m;
for (int i = 2; i <= n; i++) {
int x = calc(i);
if (x != -1) {
int val = m / i;
if (x & 1) val *= -1;
for (int j = i; j <= n; j += i) euler[i] += val;
}
}
}
void solve() {
sieve_prime();
sieve();
for (int i = 1; i <= n; i++) ans += euler[i];
cout << ans;
}
};
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("CGCD.inp")) {
freopen("CGCD.inp", "r", stdin);
freopen("CGCD.out", "w", stdout);
}
cin >> n >> m;
if (n <= 1000 && m <= 1000) return sub1::solve(), 0;
if (n <= 1e6 && n == m) return sub2::solve(), 0;
if (n > m) swap(n, m);
return subfull::solve(), 0;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZnQgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKdXNpbmcgbGwgPSBsb25nIGxvbmc7CmNvbnN0IGludCBOID0gMWU3ICsgNTsKaW50IG4sIG07CmxsIGV1bGVyW05dOwpsbCBhbnMgPSAwOwpib29sIHByaW1lW05dOwppbnQgcFtOXTsKCm5hbWVzcGFjZSBzdWIxIHsKdm9pZCBzb2x2ZSgpIHsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgZm9yIChpbnQgaiA9IDE7IGogPD0gbTsgaisrKSBpZiAoX19nY2QoaSwgaikgPT0gMSkgYW5zKys7CiAgICBjb3V0IDw8IGFuczsKfQp9OwpuYW1lc3BhY2Ugc3ViMiB7CnZvaWQgc2lldmVfZXVsZXJfcGhpKCl7CiAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIGV1bGVyW2ldID0gaTsKCiAgICBwcmltZVswXSA9IHByaW1lWzFdID0gMTsKICAgIGZvciAoaW50IGkgPSAyOyBpICogaSA8PSBuOyBpKyspewogICAgICAgIGlmICghcHJpbWVbaV0pewogICAgICAgICAgICBmb3IgKGludCBqID0gIGkgKiBpOyBqIDw9IG47IGogKz0gaSl7CiAgICAgICAgICAgICAgICBwcmltZVtqXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICBpZiAoIXByaW1lW2ldKXsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPD0gbjsgaiArPSBpKXsKICAgICAgICAgICAgICAgIGV1bGVyW2pdIC09IGV1bGVyW2pdIC8gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGV1bGVyWzFdID0gMTsKfQp2b2lkIHNvbHZlKCkgewogICAgc2lldmVfZXVsZXJfcGhpKCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFucyArPSBldWxlcltpXTsKICAgIGFucyA9IGFucyAqIDIgLSAxOwogICAgY291dCA8PCBhbnM7Cn0KfTsKbmFtZXNwYWNlIHN1YmZ1bGwgewp2b2lkIHNpZXZlX3ByaW1lKCkgewogICAgcHJpbWVbMF0gPSBwcmltZVsxXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHBbaV0gPSBpOwogICAgZm9yIChpbnQgaSA9IDI7IGkgKiBpIDw9IG47IGkrKyl7CiAgICAgICAgaWYgKCFwcmltZVtpXSkgewogICAgICAgICAgICBmb3IgKGludCBqID0gaSAqIGk7IGogPD0gbjsgaiArPSBpKSB7CiAgICAgICAgICAgICAgICBwcmltZVtqXSA9IHRydWU7CiAgICAgICAgICAgICAgICBwW2pdID0gbWluKGksIHBbal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmlubGluZSBpbnQgY2FsYyhpbnQgeCkgewogICAgaW50IGNudCA9IDAsIHByZSA9IC0xOwogICAgd2hpbGUgKHggIT0gMSkgewogICAgICAgIGludCB0ID0gcFt4XTsKICAgICAgICBpZiAodCA9PSBwcmUpIHJldHVybiAtMTsKICAgICAgICB4IC89IHQ7CiAgICAgICAgY250Kys7CiAgICAgICAgcHJlID0gdDsKICAgIH0KICAgIHJldHVybiBjbnQ7Cn0Kdm9pZCBzaWV2ZSgpewogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBldWxlcltpXSA9IG07CiAgICBmb3IgKGludCBpID0gMjsgaSA8PSBuOyBpKyspIHsKICAgICAgICBpbnQgeCA9IGNhbGMoaSk7CiAgICAgICAgaWYgKHggIT0gLTEpIHsKICAgICAgICAgICAgaW50IHZhbCA9IG0gLyBpOwogICAgICAgICAgICBpZiAoeCAmIDEpIHZhbCAqPSAtMTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPD0gbjsgaiArPSBpKSBldWxlcltpXSArPSB2YWw7IAogICAgICAgIH0KICAgIH0KfQp2b2lkIHNvbHZlKCkgewogICAgc2lldmVfcHJpbWUoKTsKICAgIHNpZXZlKCk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIGFucyArPSBldWxlcltpXTsKICAgIGNvdXQgPDwgYW5zOwp9Cn07CgpzaWduZWQgbWFpbigpIHsKICAgIGNpbi50aWUoTlVMTCktPnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBpZihpZnN0cmVhbSgiQ0dDRC5pbnAiKSkgewogICAgICAgIGZyZW9wZW4oIkNHQ0QuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiQ0dDRC5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBjaW4gPj4gbiA+PiBtOwogICAgaWYgKG4gPD0gMTAwMCAmJiBtIDw9IDEwMDApIHJldHVybiBzdWIxOjpzb2x2ZSgpLCAwOwogICAgaWYgKG4gPD0gMWU2ICYmIG4gPT0gbSkgcmV0dXJuIHN1YjI6OnNvbHZlKCksIDA7CiAgICBpZiAobiA+IG0pIHN3YXAobiwgbSk7CiAgICByZXR1cm4gc3ViZnVsbDo6c29sdmUoKSwgMDsKICAgIHJldHVybiAwOwp9Cg==