#include <iostream>
#include <iomanip> //<<setprecision(12), or <<fixed
#include <algorithm>
#include <functional>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
#include <set>
 
using namespace std;

using ll=long long;
using ull=unsigned long long;
using pll=pair<ll,ll>;

int main()
{
    ll A,B,C;
    cin>>A>>B>>C;
    
    vector<vector<vector<double>>> dp(101,vector<vector<double>>(101,vector<double>(101,-1)));
    for(ll i=0; i<=100; i++)
    {
        for(ll k=0; k<=100; k++)
        {
            dp[100][i][k]=0;
            dp[i][100][k]=0;
            dp[i][k][100]=0;
        }
    }
    
    auto e=[&](auto& e, ll a, ll b, ll c)
    {
        if(dp[a][b][c]!=-1) return dp[a][b][c];
        
        double res=(e(e,a+1,b,c)+1)*a/(double)(a+b+c)
                    +(e(e,a,b+1,c)+1)*b/(double)(a+b+c)
                    +(e(e,a,b,c+1)+1)*c/(double)(a+b+c);
                    
        dp[a][b][c]=res;
        return res;
    };
    
    cout<<fixed<<setprecision(15)<<e(e,A,B,C)<<endl;
    // Fear misreading.
    return 0;
}

#include<bits/stdc++.h>
#define ST first
#define ND second
#define ll long long
#define ld long double
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
using namespace std;

const ll  INF = 1e9 + 9;
//const ll  MOD = 1e9 + 7;
const ll MOD = 998244353;
const long long LINF = (ll)1e18 + 3;

// secik.insert({x, t++});
// secik.erase(secik.lower_bound({x,-1}));
// *secik.find_by_order(x)).first << "\n";
// secik.order_of_key(x)

//random_device device;
//mt19937 gener(device());
//uniform_int_distribution<ll > gen(0,n-1);
//gen(gener); // generate random number

int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	ll A,B,C; cin >> A >> B >> C;
	
	ll x = A * (A+1)/2, y = B * (B+1)/2, z = C * (C+1)/2;
	x %= MOD;
	y %= MOD;
	z %= MOD;
	cout << max(((x * y) % MOD * z) % MOD,(((x * y) % MOD * z) % MOD + MOD) % MOD);
	
	
	return 0;
}