#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cstdint>
#include <cstdio>
#include <cstring>
#include <deque>
#include <iomanip>
#include <ios>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
// avoid unordered_map and unordered_set!!!
#include <vector>
#include <utility>

using namespace std;

using i64 = int64_t;
using u64 = uint64_t;
using i32 = int32_t;
using pi64 = pair<i64, i64>;

#define vec vector
#define let const
#define DRi64(x) i64 x; cin >> x;
#define DRS(x) string x; cin >> x;
#define DRVi64(v, n) vec<i64> v(n); { for (i64 i = 0; i < n; ++i) { cin >> v[i]; }}
#define DRpi64(x) pi64 x; cin >> x.first >> x.second;

#ifdef DEBUG
#define P(x) cerr << x << "\n"
#else
#define P(x)
#endif

constexpr i64 MAXN = 3*100*1000LL+5LL;
constexpr i64 MOD = 1000000007LL;
constexpr i64 INF64 = MOD * MOD;
constexpr double EPS = 1e-9;

int
main()
{
    ios_base::sync_with_stdio(false);
    // fast io: see 1423K
    cin.tie(nullptr);
    cout.tie(nullptr);

    DRi64(R); DRi64(X); DRi64(Y);
    let i64 d2_from_orig = X * X + Y  * Y;
    let i64 R2 = R * R;
    if (d2_from_orig < R2)
    {
        cout << "2\n";
        return 0;
    }
    let i64 q = d2_from_orig / R2;
    let double sqrt_q = sqrt(q);
    if (d2_from_orig % R2 == 0 && q == i64(sqrt_q) * i64(sqrt_q))
    {
        cout << i64(sqrt_q) << "\n";
        return 0;
    }
    cout << i64(sqrt_q + 1) << "\n";

    return 0;
}

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T>>;
template<class T> using vvvc = vc<vvc<T>>;
template<class T> using vvvvc = vvc<vvc<T>>;
template<class T> using PQ = priority_queue<T>;
template<class T> using invPQ = priority_queue<T, vector<T>, greater<T>>;
using IP = pair<int, int>;
using LP = pair<ll, ll>;
#define mp make_pair
#define pb push_back
#define all(x) begin(x), end(x)
#define rep(i, n) for (int i = 0; (i) < (int)(n); i++)
#define rep3(i, m, n) for (int i = (m); (i) < (int)(n); i++)
#define repr(i, n) for (int i = n; (i) >= 0; i--)
#define rep3r(i, m, n) for (int i = (n); (i) >= (int)(m); i--)
template<class T> inline bool chmax(T & a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T & a, T b) { if (a > b) { a = b; return 1; } return 0; }
constexpr int INF = 1070000000;
constexpr long long LINF = 4611686015206162431;

vector<int> sieve(int n) {
    vector<bool> mem(n+1, true);
    mem[0] = false; mem[1] = false;
    for (int i = 2; i*i <= n; i++) {
        if (mem[i]) {
            for (int j = i*2; j <= n; j += i) {
                mem[j] = false;
            }
        }
    }
    vector<int> res;
    rep (i, n+1) if (mem[i]) res.push_back(i);
    return res;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    ll A, B;
    cin >> A >> B;
    
    int N = B - A + 1, d = B - A;

    vc<int> primes = sieve(d);

    vc<int> fac(N);
    for (ll a = A; a <= B; a++) {
        rep (i, primes.size()) {
            fac[a-A] *= 2;
            if (a % primes[i] == 0) {
                fac[a-A]++;
            }
        }
    }

    vvc<ll> dp(N+1, vc<ll>(1 << primes.size()));
    dp[0][0] = 1;
    
    rep (i, N) {
        rep (j, 1 << primes.size()) {
            if (!(j&fac[i])) dp[i+1][j|fac[i]] += dp[i][j];
            dp[i+1][j] += dp[i][j];
        }
    }

    ll ans = 0;
    rep (i, 1 << primes.size()) {
        ans += dp[N][i];
    }
    cout << ans << endl;
}