输入1
3
1 2
4 2
3 4
输出1
4
输入2
4
1 5
2 6
3 7
4 8
输出2
16
输入3
8
877914575 602436426
861648772 623690081
476190629 262703497
971407775 628894325
822804784 450968417
161735902 822804784
161735902 822804784
822804784 161735902
输出3
48
给出n组数,每组的第一个是正面的值,默认不翻牌的情况是正面的值,问我们有多少种翻牌的方式使得每个相邻的两组数是不同的,翻的话就是我们这组选择第二个数
#include <iostream>
#include <bits/stdc++.h>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#define x first
#define y second
#define pb emplace_back
#define fu(i,a,b) for(int i=a;i<=b;i ++ )
#define fd(i,a,b) for(int i=a;i>=b;i -- )
#define endl '\n'
#define ms(x,y) memset(x,y,sizeof x)
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL;
typedef vector<vector<LL>> VVL;
typedef vector<LL> VL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
typedef pair<double,int> PDI;
typedef pair<char,int> PCI;
typedef pair<string,int> PSI;
typedef pair<int,string> PIS;
typedef pair<LL,LL> PLL;
typedef __int128 i128;
typedef unsigned long long ULL;
const int N = 1e6+ 10,M = N * 4,INF = 0x3f3f3f3f ;
const double eps = 1e-8;
int n,m,k,idx;
LL f[N][2],a[N],b[N],mod = 998244353;
inline void solve()
{
cin >> n;
fu(i,1,n) cin >> a[i] >> b[i] ;
f[1][0] = f[1][1] = 1;
fu(i,2,n)
{
LL &t1 = f[i][0] ,&t2 = f[i][1];
if(a[i] != a[i-1])t1 = f[i-1][0] % mod;
if(a[i] !=b[i-1]) t1 += f[i-1][1] % mod ;
if(b[i] != a[i-1]) t2 += f[i-1][0]% mod;
if(b[i] != b[i-1]) t2 += f[i-1][1]% mod;
}
cout << (f[n][0] + f[n][1]) % mod << endl;
}
signed main()
{
// freopen("1.txt","w",stdout);
ios
int t=1;
// cin>>t;
int now = 1;
while(t -- )
{
// cout<<"Case ";
// cout<<"Scenario #";
// cout<< now ++ <<": ";
// cout<< now ++ <<": \n";
solve();
}
return 0;
}