//雪花飄飄北風嘯嘯
//天地一片蒼茫

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define ll long long
#define ii pair<ll,ll>
#define iii pair<ii,ll>
#define fi first
#define se second
#define endl '\n'
#define debug(x) cout << #x << " is " << x << endl

#define rep(x,start,end) for(auto x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()

#define indexed_set tree<ll,null_type,less<ll>,rb_tree_tag,tree_order_statistics_node_update>
//change less to less_equal for non distinct pbds, but erase will bug

mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

const int MOD=998244353;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin.exceptions(ios::badbit | ios::failbit);
	
	ll a,b,c;
	cin>>a>>b>>c;
	
	a=((a)*(a+1)/2)%MOD;
	b=((b)*(b+1)/2)%MOD;
	c=((c)*(c+1)/2)%MOD;
	
	cout<<a*b%MOD*c%MOD<<endl;
}

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
const int mod=998244353;
inline LL ksm(LL x,LL a){
	LL ret=1,k=x;
	for (;a;a>>=1,k=k*k%mod)
		if (a&1) ret=ret*k%mod;
	return ret%mod;
}
int main(void)
{
    LL a,b,c;cin>>a>>b>>c;
    LL aa=(a+1)%mod*a%mod*ksm(2,mod-2)%mod;
    LL bb=(b+1)%mod*b%mod*ksm(2,mod-2)%mod;
    LL cc=(c+1)%mod*c%mod*ksm(2,mod-2)%mod;
    printf("%lld",aa%mod*bb%mod*cc%mod);
}
