#include <bits/stdc++.h>
namespace IO {
char buf[100];
}
template <typename T>
inline void qr(T &x) {
  char ch = getchar(), lst = ' ';
  while (ch > '9' || ch < '0') lst = ch, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
  if (lst == '-') x = -x;
}
template <typename T>
inline void write(T x, const char aft, const bool pt) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  int top = 0;
  do {
    IO::buf[++top] = x % 10 + '0';
    x /= 10;
  } while (x);
  while (top) putchar(IO::buf[top--]);
  if (pt) putchar(aft);
}
template <typename T>
inline T mmax(const T _a, const T _b) {
  if (_b < _a) return _a;
  return _b;
}
template <typename T>
inline T mmin(const T _a, const T _b) {
  if (_a > _b) return _b;
  return _a;
}
template <typename T>
inline T mabs(const T _a) {
  if (_a < 0) return -_a;
  return _a;
}
template <typename T>
inline void mswap(T &_a, T &_b) {
  T _temp = _a;
  _a = _b;
  _b = _temp;
}
long long int l, r, w, lst = 1, ans = 1;
bool haveoutput;
int main() {
  qr(l);
  qr(r);
  qr(w);
  if (w == 1ll) {
    if (l != 1ll)
      return printf("-1\n") & 0;
    else
      return printf("1\n") & 0;
  }
  if (l == 1ll) {
    write(1, ' ', true);
    haveoutput = true;
  }
  while (true) {
    ans *= w;
    if (ans / w != lst) break;
    lst = ans;
    if (ans >= l) {
      if (ans <= r) {
        write(ans, ' ', true);
        haveoutput = true;
      } else
        break;
    }
  }
  if (!haveoutput) puts("-1");
  return 0;
}
