#include using namespace std; using ll=long long; const ll ILL=2167167167167167167; const int INF=2100000000; #define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++) #define all(p) p.begin(),p.end() template using pq_ = priority_queue, greater>; template int LB(vector &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();} template int UB(vector &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();} template bool chmin(T &a,T b){if(b bool chmax(T &a,T b){if(a void So(vector &v) {sort(v.begin(),v.end());} template void Sore(vector &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});} bool yneos(bool a,bool upp=false){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;} template void vec_out(vector &p,int ty=0){ if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'< T vec_min(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;} template T vec_max(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;} template T vec_sum(vector &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;} int pop_count(long long a){int res=0;while(a){res+=(int)(a&1),a>>=1;}return res;} template T square(T a){return a * a;} #include using mint = atcoder::modint998244353; // https://github.com/kth-competitive-programming/kactl/tree/main/content/geometry template ll sgn(T x) { return (x > 0) - (x < 0); } template struct Point { using P = Point; T x, y; explicit Point(T x = 0, T y = 0) : x(x), y(y) {} bool operator<(P p) const { return tie(x, y) < tie(p.x, p.y); } bool operator==(P p) const { return tie(x, y) == tie(p.x, p.y); } P operator+(P p) const { return P(x + p.x, y + p.y); } P operator-(P p) const { return P(x - p.x, y - p.y); } P operator*(T d) const { return P(x * d, y * d); } P operator/(T d) const { return P(x / d, y / d); } T dot(P p) const { return x * p.x + y * p.y; } T cross(P p) const { return x * p.y - y * p.x; } T cross(P a, P b) const { return (a - *this).cross(b - *this); } T dist2() const { return x * x + y * y; } double dist() const { return sqrt(dist2()); } // angle to x-axis in interval [-pi, pi] double angle() const { return atan2(y, x); } P unit() const { return *this / dist(); } // makes dist()=1 P perp() const { return P(-y, x); } // rotates +90 degrees P normal() const { return perp().unit(); } // returns point rotated 'a' radians ccw around the origin P rotate(double a) const { return P(x * cos(a) - y * sin(a), x * sin(a) + y * cos(a)); } friend ostream& operator<<(ostream& os, P p) { return os << "(" << p.x << "," << p.y << ")"; } }; bool _2d_comp(pair &l,pair &r){ if(l.first==0&&r.first==0) return l.second>r.second; if(l.first==0){ return l.second>0||r.first<0; } if(r.first==0){ return !(r.second>0||l.first<0); } if((l.first<0)^(r.first<0)) return l.first>0; return l.first*r.second> t; rep(i, 0, t) solve(); } void solve(){ vector Z(4); vector> P(4); rep(i, 0, 4){ cin >> P[i].x >> P[i].y >> Z[i]; } vector> Q(3); rep(i, 0, 3){ P[i].x -= P[3].x; P[i].y -= P[3].y; Q[i] = {P[i].x, P[i].y}; } vector order(3); rep(i, 0, 3) order[i] = i; sort(all(order), [&](int l, int r){ return _2d_comp(Q[l], Q[r]); }); mint ans = 0; order.push_back(order[0]); vector> R(3); rep(i, 0, 3){ R[i].first = Q[i].first; R[i].second = Q[i].second; R[i].first /= (Z[3] - Z[i]); R[i].second /= (Z[3] - Z[i]); } rep(i, 0, 3){ int a = order[i]; int b = order[i + 1]; ans += R[a].first * R[b].second - R[b].first * R[a].second; } ans *= Z[3]; ans *= Z[3]; ans /= 2; ans *= -1; cout << ans.val() << "\n"; }