#include #include #include using namespace std; using namespace atcoder; using mint=atcoder::static_modint<998244353>; #define rep(i,a,b) for(int i=(a);i<(b);++i) #define all(n) (n).begin(),(n).end() arrayfact; using lint=long long; vector shift(vectora,int t,int m=-1){ int n=a.size(); if(m==-1){ return shift(a,t,n); }else if(m==0){ return vector(); }else if(mn){ int z=max(n,m-n); auto p=shift(a,t,z); auto q=shift(a,t+z,n); p.insert(p.end(),q.begin(),q.end()); p.resize(m); return p; } //前計算 vectorfact(n,1),expx(n,1),expr(n,1),v(n,1); rep(i,1,n)fact[i]=fact[i-1]*i; expx[n-1]=fact[n-1].inv(); for(int i=n-2;i>=0;--i)expx[i]=expx[i+1]*(i+1); rep(i,0,n)expr[i]=expx[i]*(i%2?-1:1); rep(i,1,n)v[i]=v[i-1]*(t-i+1); rep(i,0,n)v[i]*=expx[i]; // 下降冪表示に変換 rep(i,0,n)a[i]*=expx[i]; a=atcoder::convolution(a,expr); a.resize(n); // shift rep(i,0,n)a[i]*=fact[i]; reverse(all(a)); a=atcoder::convolution(a,v); a.resize(n); reverse(all(a)); rep(i,0,n)a[i]*=expx[i]; // 標本点に変換 a=atcoder::convolution(a,expx); a.resize(n); rep(i,0,n)a[i]*=fact[i]; return a; } array mul(const array& a,const array& b){ arrayres; res.fill(0); rep(i,0,2)rep(k,0,2)rep(j,0,2){ res[i+k*2]+=a[i+j*2]*b[j+k*2]; } return res; } array,4> shift(array,4> a){ int n=a[0].size(); // rep(t,0,1)rep(j,0,n)cout<,4>b; rep(i,0,4)b[i].resize(n*2); rep(j,0,n*2){ auto c=mul(array{a[0][j*2],a[1][j*2],a[2][j*2],a[3][j*2]},array{a[0][j*2+1],a[1][j*2+1],a[2][j*2+1],a[3][j*2+1]}); rep(i,0,4)b[i][j]=c[i]; } return b; } void solve2(){ lint n,k; cin>>n>>k; if(k>=mint::mod()){ cout<<0<,4>a=array,4>{vector{mint(n)*2,mint(n-1)*2,mint(n-2)*2},vector{mint(0),mint(n),mint(n*2-1)},vector(3,mint(1)),vector(3,mint(0))}; lint i=1; for(;i*i*3 ans=array{mint(1),mint(0),mint(0),mint(1)}; // auto ans2=ans; for(;(j+1)*i{a[0][j],a[1][j],a[2][j],a[3][j]}); } auto get=[&](lint k){ return array{mint(n-k)*2,mint(k)*(n*2-k+1)/2,mint(1),mint(0)}; }; // cerr<sync_with_stdio(0); int t; cin>>t; while(t--){ solve2(); } }