// Template begins
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <queue> 
#include <string.h>
#include <string>
using namespace std;
#define fio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define ll long long
#define endl "\n"
#define lb lower_bound
#define ub upper_bound
#define fo(i,a,b) for(i=a;i<=b;i++)
#define all(v) (v).begin(),(v).end()
#define sort0(v) sort(all(v))
#define lbb(a,b,arr,x) lower_bound(arr+a,arr+b+1,x)-arr
#define ubb(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-arr
#define freq(a,b,arr,x) upper_bound(arr+a,arr+b+1,x)-lower_bound(arr+a,arr+b+1,x)
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define d0(x) cout<<(x)<<" "
#define d1(x) cout<<(x)<<endl
#define d2(x,y) cout<<(x)<<" "<<(y)<<endl
#define d3(x,y,z) cout<<(x)<<" "<<(y)<<" "<<(z)<<endl
#define d4(a,b,c,d) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<endl
#define d5(a,b,c,d,e) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<endl
#define d6(a,b,c,d,e,f) cout<<(a)<<" "<<(b)<<" "<<(c)<<" "<<(d)<<" "<<(e)<<" "<<(f)<<endl
#define max3(a,b,c) max(max((a),(b)),(c))
#define max4(a,b,c,d) max(max((a),(b)),max((c),(d)))
#define ss second
#define ff first
#define pb push_back
#define mp make_pair
#define printp(x) cout << x.ff << " " << x.ss << endl
 
const ll mod=998244353;
#define inf 9999999999999
#define MAXN   100001 
  
// stores smallest prime factor for every number 
 
 
ll inv(ll i){if(i==1) return 1;return (mod-((mod/i)*inv(mod%i))%mod)%mod;}
 
ll gcd(ll a,ll b){if(a==0) return b;return gcd(b,b%a);}
inline void fastio(){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);}
// Template ends
const int MN = 2e5+7;
ll val(ll a){
    return ((a*(a+1))/2)%mod;
}
void solve(){
    ll a,b,c; cin>>a>>b>>c;
    a%=mod; b%=mod; c%=mod;
    ll ans=val(a); ans%=mod;
    ans= (ans*val(b))%mod;
    ans=(ans*val(c))%mod;
    cout<<ans<<endl;
    
}
int main(){
    fastio();
    //write code
    int t; t=1;
    while(t--){
        solve();
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define P pair<int,char>
#define Tp tuple<int,int,int>
using Graph = vector<vector<P>>;

//Cの計算 C[i][j]でiCjを得る
void combination(vector<vector <long long> > &v){
    for(int i = 0;i <v.size(); i++){
        v[i][0]=1;
        v[i][i]=1;
    }
    for(int k = 1;k <v.size();k++){
        for(int j = 1;j<k;j++){
          //modの法は問題により変更
          v[k][j]=(v[k-1][j-1]+v[k-1][j])%998244353;
        }
    }
}

ll ptn(ll k,ll N,vector<vector<ll>> &C,vector<ll> &f){
    ll a = 0;
    if(f[k]!=-1) return f[k];
    if(k==0) return 1LL;
    if(k==2) return C[N][2];
    for(ll i=0;i<=k;i += 2){
        if((k-i)%4!=0) continue;
        a += (C[N][i]*ptn((k-i)/2,N,C,f))%998244353; a%= 998244353;
    }
    f[k] = a; return a;
}

int main(){
    //main関数内に以下をペースト Kは計算が必要な最大の大きさ
    vector<vector<long long>> C(5001,vector<long long int>(5001,0));
    combination(C);
    ll N,M; cin >> N >> M;
    vector<ll> f;
    rep(i,M+1){
        f.push_back(-1);
    }
    ll ans = ptn(M,N,C,f);
    cout << ans  << endl;
}