#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long fp(long long x, long long exp) {
  if (exp == 0) return 1;
  if (exp % 2 == 0) return fp((x * x) % 1000000009, exp / 2) % 1000000009;
  return (((fp((x * x) % 1000000009, exp / 2)) % 1000000009) * x) % 1000000009;
}
long long gcd(long long a, long long b) {
  if (!b) return a;
  return gcd(b, a % b);
}
long long fact[1000006], inv[1000006];
void calcFacAndInv(long long n) {
  fact[0] = inv[0] = 1;
  for (long long i = 1; i <= n; i++)
    fact[i] = (i * fact[i - 1]) % 1000000009,
    inv[i] = fp(fact[i], 1000000009 - 2);
}
long long ncr(long long n, long long r) {
  return ((fact[n] * inv[r]) % 1000000009 * inv[n - r]) % 1000000009;
}
long long npr(long long n, long long r) {
  return (fact[n] * inv[n - r]) % 1000000009;
}
vector<bool> prime(10000001, true);
void sieve(int n) {
  prime[0] = prime[1] = false;
  for (int i = 2; i <= n; i++)
    for (int j = i * i; j <= n && prime[i] && i * 1ll * i <= n; j += i)
      prime[j] = false;
}
int par[200005], rnk[200005];
int findp(int x) {
  if (par[x] == x) return x;
  return par[x] = findp(par[x]);
}
bool iscon(int x, int y) {
  if (findp(x) == findp(y)) return true;
  return false;
}
void con(int x, int y) {
  int px = findp(x), py = findp(y);
  if (rnk[px] > rnk[py])
    par[py] = px;
  else if (rnk[px] < rnk[py])
    par[px] = py;
  else
    par[px] = py, rnk[px]++;
}
double dis(double x, double y) { return sqrt(x * x + y * y); }
double polygonArea(double x[], double y[], int n) {
  double area = 0.0;
  int j = n - 1;
  for (int i = 0; i < n; i++) area += (x[j] + x[i]) * (y[j] - y[i]), j = i;
  return abs(area / 2.0);
}
void dij() {}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  long long n, k;
  cin >> n >> k;
  cout << k / n + ((k % n) ? 1 : 0);
  return 0;
}
