#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;   }   