#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;
}
