#include <bits/stdc++.h>
using namespace std;
const int MAXN = 360361;
const int n = 360360;
const int INF = 1012345678;
long long a, b;
int k, dist[MAXN];
queue<int> q;
void update(int x, int value) {
  if (dist[x] == INF) {
    dist[x] = value;
    q.push(x);
  }
}
long long BFS(int s, int t) {
  fill(dist, dist + MAXN, INF);
  for (update(s, 0); !q.empty(); q.pop()) {
    int x = q.front();
    if (x) {
      update(x - 1, dist[x] + 1);
    }
    for (int i = 2; i <= k; i++) {
      update(x / i * i, dist[x] + 1);
    }
  }
  return dist[t];
}
long long calc(long long a, long long b) {
  long long A = a / n, B = b / n;
  return A == B ? BFS(a % n, b % n)
                : BFS(a % n, 0) + (A - B - 1) * BFS(n, 0) + BFS(n, b % n);
}
int main() {
  scanf("%I64d%I64d%d", &a, &b, &k);
  printf("%I64d\n", calc(a, b));
  return 0;
}
