#include<bits/stdc++.h>usingnamespacestd;constintface_up=0;constintface_down=1;constintmod=998244353;voidadd(int&a,intb){a+=b;a%=mod;}intsolve(vector<int>&up,vector<int>&down){intn=up.size();// dp[i][state] is the number of "valid" configurations of cards[0...i] in
// which the i-th elements ends up in state "state".
// Note:
// 1. State can be one of "face_up" or "face_down".
// 2. A valid configuration is one where no two adjacent elements are equal.
vector<vector<int>>dp(n,vector<int>(2,0));// Base case. When we have just one card, there's one way of arranging
// it face up and one way of arranging it face down.
dp[0][face_up]=1;dp[0][face_down]=1;for(inti=1;i<n;i++){// Case 1 : The state of i-1 and i^th card is : (face_up), (face_up)
if(up[i-1]!=up[i]){add(dp[i][face_up],dp[i-1][face_up]);}// Case 2 : The state of i-1 and i^th card is : (face_down), (face_up)
if(down[i-1]!=up[i]){add(dp[i][face_up],dp[i-1][face_down]);}// Case 3 : The state of i-1 and i^th card is : (face_up), (face_down)
if(up[i-1]!=down[i]){add(dp[i][face_down],dp[i-1][face_up]);}// Case 4 : The state of i-1 and i^th card is : (face_down), (face_down)
if(down[i-1]!=down[i]){add(dp[i][face_down],dp[i-1][face_down]);}}intans=0;add(ans,dp[n-1][face_up]);add(ans,dp[n-1][face_down]);returnans;}intmain(){intn;cin>>n;vector<int>up(n),down(n);for(inti=0;i<n;i++){cin>>up[i]>>down[i];}intres=solve(up,down);cout<<res<<"\n";}