#include <bits/stdc++.h>
using namespace std;
long long int MOD = 1e9 + 7;
inline long long int mul(long long int a, long long int b,
                         long long int mod = MOD) {
  return ((a % mod) * (b % mod)) % mod;
}
inline long long int sum(long long int a, long long int b,
                         long long int mod = MOD) {
  return ((a % mod) + (b % mod)) % mod;
}
long long int power(long long int a, long long int n, long long int mod = MOD) {
  long long int ans = 1;
  while (n) {
    if (n & 1) ans = mul(ans, a, mod);
    a = mul(a, a, mod);
    n >>= 1;
  }
  return ans;
}
inline long long int sub(long long int a, long long int b,
                         long long int mod = MOD) {
  return (((a) % mod) - ((b) % mod) + mod) % mod;
}
void solve();
const long long int N = 2 * 1e3 + 10;
struct DSU {
  long long int totlst;
  long long int link[N], sz[N];
  DSU() {}
  DSU(long long int n) {
    for (long long int i = 1; i <= n; i++) {
      link[i] = i;
      sz[i] = 1;
    }
    totlst = n;
  }
  long long int find(long long int x) {
    if (x == link[x]) {
      return x;
    }
    return link[x] = find(link[x]);
  }
  bool same(long long int a, long long int b) { return (find(a) == find(b)); }
  void unite(long long int a, long long int b) {
    a = find(a);
    b = find(b);
    if (a == b) {
      return;
    }
    totlst--;
    if (sz[a] < sz[b]) {
      sz[b] += sz[a];
      sz[a] = 0;
      link[a] = b;
    } else {
      sz[a] += sz[b];
      sz[b] = 0;
      link[b] = a;
    }
  }
  long long int getSize(long long int k) { return sz[find(k)]; }
  long long int getDisjointsets() { return totlst; }
};
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long int t = 1;
  while (t--) solve();
  return 0;
}
void solve() {
  long long int i, j, cnt = 0;
  bool flag = 0;
  long long int n, m, k;
  cin >> n >> m >> k;
  DSU g(n);
  for (i = 0; i <= n - k; i++) {
    long long int s = i;
    long long int d = i + k - 1;
    while (s < d) {
      g.unite(s, d);
      s++;
      d--;
    }
  }
  long long int ans = power(m, g.getDisjointsets());
  cout << ans << "\n";
}
