#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <limits>
#include <climits>
#include <cmath>
#include <functional>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include <typeinfo>
#include <cassert>
#include <unordered_map>
#include <unordered_set>

#define debug(x) cout<<(x)<<'\n'

#define endl '\n'
#define remainder safdskhaslfa
#define pow aafkhffhlgsdas
#define distance dagkjsdsdsara
#define left askfjasieqwskajdaks

using namespace std;

typedef long long int ll;
typedef short int i16;
typedef unsigned long long int u64;
typedef unsigned int u32;
typedef unsigned short int u16;
typedef unsigned char u8;

bool used[128][128][128];
double state[128][128][128];

double recurse1(int r, int s, int p) {
    if(p==0 && s==0) {
        if(r==0) return 0.0;
        return 1.0;
    }

    if(r==0) {
        return 0.0;
    }

    if(used[r][s][p]) return state[r][s][p];

    double ans=0.0;
    int total=r*s+r*p+p*s;

    if(r>0 && s>0) {
        ans+=(double)r*s/(double)total*recurse1(r,s-1,p);
    }

    if(r>0 && p>0) {
        ans+=(double)r*p/(double)total*recurse1(r-1,s,p);
    }

    if(p>0 && s>0) {
        ans+=(double)p*s/(double)total*recurse1(r,s,p-1);
    }

    used[r][s][p]=true;
    state[r][s][p]=ans;

    return ans;
}

double recurse2(int r, int s, int p) {
    if(r==0 && p==0) {
        if(s==0) return 0.0;
        return 1.0;
    }

    if(s==0) {
        return 0.0;
    }

    if(used[r][s][p]) return state[r][s][p];

    double ans=0.0;
    int total=r*s+r*p+p*s;

    if(r>0 && s>0) {
        ans+=(double)r*s/(double)total*recurse2(r,s-1,p);
    }

    if(r>0 && p>0) {
        ans+=(double)r*p/(double)total*recurse2(r-1,s,p);
    }

    if(p>0 && s>0) {
        ans+=(double)p*s/(double)total*recurse2(r,s,p-1);
    }

    used[r][s][p]=true;
    state[r][s][p]=ans;

    return ans;
}

double recurse3(int r, int s, int p) {
    if(r==0 && s==0) {
        if(p==0) return 0.0;
        return 1.0;
    }

    if(p==0) {
        return 0.0;
    }

    if(used[r][s][p]) return state[r][s][p];

    double ans=0.0;
    int total=r*s+r*p+p*s;

    if(r>0 && s>0) {
        ans+=(double)r*s/(double)total*recurse3(r,s-1,p);
    }

    if(r>0 && p>0) {
        ans+=(double)r*p/(double)total*recurse3(r-1,s,p);
    }

    if(p>0 && s>0) {
        ans+=(double)p*s/(double)total*recurse3(r,s,p-1);
    }

    used[r][s][p]=true;
    state[r][s][p]=ans;

    return ans;
}

int r,s,p;

void input() {
    scanf("%d %d %d", &r, &s, &p);
}

void solve() {
    memset(used,0,sizeof(used));
    printf("%.15lf", recurse1(r,s,p));

    memset(used,0,sizeof(used));
    printf(" %.15lf", recurse2(r,s,p));

    memset(used,0,sizeof(used));
    printf(" %.15lf", recurse3(r,s,p));

    printf("\n");
}

int main() {
    input();
    solve();

    return 0;
}
