#include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const int mod=998244353; const int MAX=2e5+10; ll qpow(ll a,ll b) { ll res=1; while(b>0) { if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } ll inv(ll x){return qpow(x,mod-2);} int fac[MAX],invfac[MAX]; void init_comb(int n) { assert(n<MAX); fac[0]=1; for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod; invfac[n]=inv(fac[n]); for(int i=n-1;~i;i--) invfac[i]=1ll*invfac[i+1]*(i+1)%mod; } ll C(int n,int m) { if(m>n||m<0||n<0) return 0; return 1ll*fac[n]*invfac[m]%mod*invfac[n-m]%mod; } ll A(int n,int m) { if(m>n||m<0||n<0) return 0; return 1ll*fac[n]*invfac[n-m]%mod; } struct binomial_prefix_sum { static const int B=450; int table[MAX/B+1][MAX]; void init(int n) { int i,j; init_comb(n); for(i=0;i*B<=n;i++) { table[i][0]=1; for(j=1;j<=n;j++) { table[i][j]=table[i][j-1]+C(i*B,j); if(table[i][j]>=mod) table[i][j]-=mod; } } } ll get_sum(int n,int m) { int now=n/B; ll res=table[now][m]; now*=B; while(now<n) { res=2LL*res-C(now,m); if(res>=mod) res-=mod; else if(res<0) res+=mod; now++; } return res; } }binomsum; /* f(n,m)=sum{C(n,k=0..m)} f(n+1,m)=2*f(n,m)-C(n,m) O(n sqrt n) - O(sqrt n) binomsum.init(n); binomsum.get_sum(n,m); -> sum{C(n,k=0..m)} */ int main() { binomsum.init(2e5); int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); printf("%lld\n",(qpow(2,n)-1+mod) *binomsum.get_sum(n-1,m-1)%mod); } return 0; }