// naive #include using namespace std; #include typedef atcoder::modint998244353 mint; mint det(vector> &a){ assert(a.size() == a[0].size()); int n = (int)a.size(); vector> b = a; int piv = 0; mint ret = 1; for (int j=0; j> k; vector dp(k+1, vector(2)); dp[0][0] = 1; for(int i=0; i> n >> m; vector mat1(n-1, vector(n-1)); for (int i=0; i> x >> y; x--; y--; if (x-1 >= 0 && y-1 >= 0) { mat1[x-1][y-1] -= 1; mat1[y-1][x-1] -= 1; } if (x-1 >= 0) { mat1[x-1][x-1] += 1; } if (y-1 >= 0) { mat1[y-1][y-1] += 1; } } vector> mat2 = mat1; mat2[0][0] += 1; mint val1 = det(mat1); mint val2 = det(mat2); mint type123 = val1; mint type4 = val2 - val1; dp[i+1][1] += dp[i][0] * type123; dp[i+1][0] += dp[i][0] * (type123 * 2 + type4); dp[i+1][1] += dp[i][1] * (type123 * 2 + type4); } cout << dp[k][1].val() << endl; }