题解:
先写出最后公式,推导过程以后有时间写,计蒜客官方题解中途开始出错了(不过仅仅是符号问题)。然后这里的C()指的是广义二项式定理。
ans = (-4)^(N)*(C((K+1)/(-2),N)-2*C(k/(-2),N+1)+2*C((K+1)/(-2),N+1))
#include"bits/stdc++.h"
#define ll long long
using namespace std;
const int MX = 3e5+12;
const int mod = 998244353;
int n,m;
ll f[MX],fodd[MX],inv[MX],invodd[MX],inv2[MX],Inv2,p2[MX];
ll qpow(ll a, ll n){
ll ret = 1;
while(n){
if(n&1) ret = ret*a%mod;
a = a*a%mod;
n >>= 1;
}
return ret;
}
void upd(ll &x){
x = ((x%mod)+mod)%mod;
}
void init(){
Inv2 = qpow(2,mod-2);
p2[0] = inv2[0] = 1;
for(int i = 1; i < MX; i++){
p2[i] = p2[i-1]*2%mod;
inv2[i] = inv2[i-1]*Inv2%mod;
}
f[0] = f[1] = 1;
for(int i = 2; i < MX; i++) f[i] = f[i-1]*i%mod;
inv[MX-1] = qpow(f[MX-1],mod-2);
for(int i = MX - 2; i >= 0; i--){
inv[i] = inv[i+1]*(i+1)%mod;
}
fodd[1] = 1;
for(int i = 3; i < MX; i += 2){
fodd[i] = fodd[i-2]*i%mod;
}
invodd[MX-1] = qpow(fodd[MX-1],mod-2);
for(int i = MX-3; i > 0; i -= 2){
invodd[i] = invodd[i+2]*(i+2)%mod;
}
}
ll C(int K, int N){
if(K&1) {
int invk2 = 1;
if(K == -1) invk2 = -1;
if(K-2 > 0) invk2 = invodd[K-2];
return fodd[K+2*N-2]*invk2%mod*inv[N]%mod*inv2[N]%mod;
}
if(K == 0) return 0;
return f[K/2-1+N]*inv[K/2-1]%mod*inv[N]%mod;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T;
scanf("%d",&T);
init();
while(T--){
int N,K;
scanf("%d%d",&N,&K);
ll ans = (C(K+1,N) - C(K,N+1)*2%mod + C(K-1,N+1)*2%mod + mod)%mod*p2[N*2]%mod;
printf("%lld\n",ans);
}
return 0;
}