#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
char nc() { return getchar(); }
int read() {
  int x = 0, y = 1;
  char c = nc();
  while (!isdigit(c)) {
    if (c == '-') y = -1;
    c = nc();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = nc();
  }
  return x * y;
}
int n, p, q, up, prime[135], vst[135], bin[135];
unsigned int now = 1, C[135], ANS = 0;
void divide(int x, int op) {
  for (int i = 1; i <= prime[0]; i++)
    while (!(x % prime[i])) bin[i] += op, x /= prime[i];
  if (op == 1 && x > 1) now *= (unsigned int)x;
}
unsigned int quick_pow(unsigned int x, int y) {
  unsigned int re = 1;
  while (y) {
    if (y & 1) re = re * x;
    x = x * x;
    y >>= 1;
  }
  return re;
}
void pre() {
  for (int i = 2; i <= up; i++) {
    if (!vst[i]) prime[++prime[0]] = i;
    for (int j = 1; j <= prime[0]; j++) {
      if (i * prime[j] > up) break;
      vst[i * prime[j]] = 1;
      if (!(i % prime[j])) break;
    }
  }
  C[0] = 1;
  for (int i = 1; i <= up; i++) {
    divide(n - i + 1, 1);
    divide(i, -1);
    C[i] = now;
    for (int j = 1; j <= prime[0]; j++) C[i] *= quick_pow(prime[j], bin[j]);
  }
}
int main() {
  n = read();
  p = read();
  q = read();
  up = min(n - 1, p);
  pre();
  for (int i = 1; i <= q; i++) {
    unsigned int sm = 0, ha = 1;
    for (int j = 0; j <= up; j++) sm += C[j] * ha, ha *= (unsigned int)i;
    ANS ^= (sm * (unsigned int)i);
  }
  cout << ANS;
  return 0;
}
