思路:从两个方面进行考虑。k内的点和k外的点。对于k内的点,每一个i点都有i-1个点可以选择,情况为 f i-1的一个累乘情况数量。对于剩下的点,可以选择任意情况进入。

code:

#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define ll long long
ll mod = 998244353;
const int nn = 1e6+10;
ll f[nn];
ll qpow(ll a,ll b){
	ll res = 1;
	while(b){
		if(b&1) res = (ll)res*a%mod;
		a = a*a%mod,b>>=1;
	}
	return res;
}
void solve()
{
	ll n,k;
	scanf("%d%d",&n,&k);
	if(n==k) printf("%lld\n",f[n-1]);
	else printf("%lld\n",f[k]*qpow(n,n-k-1)%mod);
}
int main()
{
 	//cin.ignore(numeric_limits<streamsize>::max(),'\n')
	//s_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	f[0] = 1;
	for(ll i=1;i<=nn;i++){
		f[i] = (ll)f[i-1]*i%mod;
	} 
	ll t;
	cin>>t;
	while(t--)
	{
		solve();
	}
}