#include using namespace std; #include using namespace atcoder; using mint=modint998244353; vector nim_prod_table(256, vector(256)); vector nim_inv_table(65536); void nim_prod_precalc() { nim_prod_table[0][0]=0; nim_prod_table[0][1]=0; nim_prod_table[1][0]=0; nim_prod_table[1][1]=1; for(int d=0;d<3;++d){ int p=1<>p; unsigned long long a_l=a-(a_h<>p; unsigned long long b_l=b-(b_h<>p; unsigned long long a_l=a-(a_h<>p; unsigned long long a_l=a-(a_h<>p; unsigned long long a_l=a-(a_h<>p; unsigned long long b_l=b-(b_h<>p; unsigned long long a_l=a-(a_h<>p; unsigned long long a_l=a-(a_h<> & m, vector & is_member) { int rank=0; for(int i=0;i0){ pivot=j; break; } } if(pivot==-1){ continue; } swap(m[pivot], m[rank]); if(rank==r-1){ ++rank; break; } auto inv=nim_inv(m[rank][i]); m[rank][i]=1; for(int k=0;k> n >> t; vector h(t, vector(n)); for(int i=0;i> h[i][j]; --h[i][j]; } } mint ans=0; vector is_member(n, true); int rank=gauss(t, n, h, is_member); vector ranks(1<=0;--r){ for(int i=0;i0){ ranks[s]=r; break; } } } while(next_permutation(is_member.begin(), is_member.end())); } for(int r=0;r0){ if(count%2>0){ ans+=p.pow(count-ranks[s]); } else { ans-=p.pow(count-ranks[s]); } } else { if(count%2>0){ ans-=p.pow(count-ranks[s]); } else { ans+=p.pow(count-ranks[s]); } } } cout << ans.val() << endl; return 0; }