#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void minimize(X &x, const Y &y) {
  if (x > y) x = y;
}
template <class X, class Y>
void maximize(X &x, const Y &y) {
  if (x < y) x = y;
}
template <class T>
T Abs(const T &x) {
  return (x < 0 ? -x : x);
}
const int mod = (int)1e6 + 3;
struct Matrix {
  int m, n;
  vector<vector<int> > d;
  Matrix() { m = n = 0; }
  Matrix(int m, int n) {
    this->m = m;
    this->n = n;
    d.assign(m, vector<int>(n, 0));
  }
  Matrix operator*(const Matrix &a) const {
    int x = m;
    int y = n;
    int z = a.n;
    Matrix res(x, z);
    for (int i = 0, _n = (x); i < _n; i = i + 1)
      for (int j = 0, _n = (y); j < _n; j = j + 1)
        for (int k = 0, _n = (z); k < _n; k = k + 1)
          res.d[i][k] = (res.d[i][k] + 1LL * d[i][j] * a.d[j][k]) % mod;
    return (res);
  }
  Matrix operator^(long long k) const {
    Matrix res(n, n);
    Matrix mul = *this;
    for (int i = 0, _n = (n); i < _n; i = i + 1)
      for (int j = 0, _n = (n); j < _n; j = j + 1) res.d[i][j] = i == j;
    while (k > 0) {
      if (k & 1) res = res * mul;
      mul = mul * mul;
      k >>= 1;
    }
    return (res);
  }
};
int solve(int c, int w, int h) {
  Matrix res(1, w + 1);
  res.d[0][0] = 1;
  Matrix mul(w + 1, w + 1);
  for (int i = 0, _n = (w + 1); i < _n; i = i + 1) {
    mul.d[i][0] = 1;
    if (i + 1 <= w) mul.d[i][i + 1] = h;
  }
  res = res * (mul ^ c);
  int sum = 0;
  for (int i = 0, _n = (w + 1); i < _n; i = i + 1)
    sum = (sum + res.d[0][i]) % mod;
  return (sum);
}
int main(void) {
  int c, w, h;
  scanf("%d%d%d", &c, &w, &h);
  printf("%d\n", solve(c, w, h));
  return 0;
}
