rt.
本地编译没有问题,样例都过了。
交了 6 发,全部 CE,没有返回原因。
#include <bits/stdc++.h>
//standard
#define up(i,l,r) for(int i=(l);i<=(r);i++)
#define down(i,r,l) for(int i=(r);i>=(l);i--)
typedef long long ll;
using namespace std;
//quick in / out
inline ll readl(){
ll f = 1, x = 0;
char ch;
do{ch = getchar();if(ch == '-')f = -1;}while(ch < '0' || ch > '9');
do{x = x * 10 + ch - '0';ch = getchar();}while(ch >= '0' && ch <= '9');
return f * x;
}
void printl(ll x){
if(x > 9) printl(x / 10);
putchar(x % 10 + '0');
}
inline int read(){
int f = 1, x = 0;
char ch;
do{ch = getchar();if(ch == '-')f = -1;}while(ch < '0' || ch > '9');
do{x = x * 10 + ch - '0';ch = getchar();}while(ch >= '0' && ch <= '9');
return f * x;
}
void print(int x){
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
}
//quick power
const ll mod = 998244353;
ll qp(ll a,ll b,ll m)
{
ll ans = 1,t = a;
while(b){
if(b & 1){
ans *= t;
ans %= m;
}
t *= t;
t %= m;
b >>= 1;
}
return ans;
}
//fraction initation
const ll MAXN = 5000005;
ll frac[MAXN];
void init(ll MAXN, ll modp)
{
frac[0] = 1;frac[1] = 1;frac[2] = 2;
for(int i = 3;i <= MAXN;i++) frac[i] = (frac[i - 1] * i) % modp;
}
//c x y
ll c(ll n,ll m, ll p) {
return (frac[n] * qp(frac[m], p - 2, p)) % p * qp(frac[n - m], p - 2, p) % p;
}
ll D[MAXN] = {1, 0};
void init_(int _MAXN)
{
up(i, 2, _MAXN)
D[i] = 4 * i % mod * (i - 1) % mod * D[i - 1] % mod + 8 * i % mod * (i - 1) % mod * (i - 1) % mod * D[i - 2] % mod;
}
ll solve(ll n, ll k)
{
return c(n, k, mod) * c(n, k, mod) % mod * frac[k] % mod * qp(2, k, mod) % mod * D[n - k] % mod;
}
int main() {
int T = read();
init(MAXN - 3, mod);
init_(MAXN - 3);
while(T--)
{
ll n = readl(), k = readl();
printl(solve(n, k));
puts("");
}
return 0;
}