思路:从两个方面进行考虑。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(); } }