#include <bits/stdc++.h>

using namespace std;

const int MAXN = 200000 + 10;
const int MOD = 998244353;

int pow(int x, int k) {
    if (k == 0) return 1;
    long long t = pow(x, k / 2);
    t = (t * t) % MOD;
    if (k % 2 == 1) t = (t * x) % MOD;
    return (int)(t);
}

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    if (min(n, m) == 1) {
        cout << pow(k, max(m, n)) << "\n";
        return 0;
    }
    
    long long res = 0;
    for(int maxa = 1; maxa <= k; ++maxa) {
        int na = (pow(maxa, n) - pow(maxa - 1, n) + MOD) % MOD, nb = pow(k - maxa + 1, m);
        res = (res + ((1LL * na * nb) % MOD) ) % MOD;
    }
    cout << res << "\n";
}
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#define MAXN 101

using namespace std;
double memo[MAXN][MAXN][MAXN]{};

double dfs(vector<int> &coins) {
  if (coins[1] == 0)
    return 100.0 - coins[0];
  if (coins[0] == 100 || coins[1] == 100 || coins[2] == 100)
    return 0.0;
  if (memo[coins[0]][coins[1]][coins[2]] >= 0)
    return memo[coins[0]][coins[1]][coins[2]];
  int s = 0;
  for (int coin : coins)
    s += coin;
  double ans = 0;
  for (int i = 0; i < 3; ++i) {
    if (coins[i] > 0) {
      vector<int> nxt(coins);
      nxt[i]++;
      ans += (double)coins[i] / s * (1 + dfs(nxt));
    }
  }
  return memo[coins[0]][coins[1]][coins[2]] = ans;
}

int main() {
  vector<int> coins(3);
  for (int i = 0; i < 3; ++i)
    cin >> coins[i];
  sort(coins.rbegin(), coins.rend());
  memset(memo, -1.0, sizeof(memo));
  printf("%.12f", dfs(coins));
}