#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define mkp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define lll __int128
#define ll long long
#define sq(x) ((x)*(x))
#define For(i,j,k) for(int i=(j); i<=(k); ++i)
#define ForDown(i,j,k) for(int i=(j); i>=(k); --i)
#define pb push_back
#define FileIO(filename) freopen(filename ".in" ,"r",stdin);freopen(filename ".out" ,"w",stdout)
template<typename T> il void read(T &x){ x=0;int f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;}
template<typename T, typename ... Args> il void read(T &x, Args &... y){ read(x);read(y...); }
template<typename T, typename ... Args> il T qpow(T x, ll y, T mod=numeric_limits<T>::max()){T ans=1;x%=mod;while(y){if(y&1)(ans*=x)%=mod;(x*=x)%=mod;y>>=1;}return ans;}
struct Num
{
const int MOD=1e9;
typedef unsigned long long BASE;
vector<BASE> a;
Num() { a.clear(); }
Num(int __n) { a.clear();while(__n)a.pb(__n%MOD),__n/=MOD; }
Num(const vector<BASE> &vec) : a(vec) {}
Num(string str){a.clear();reverse(str.begin(),str.end());int sz=str.length();for(int i=0; i<sz; i+=4){int tmp=0;ForDown(j,min(i+3,sz-1),i) (tmp*=10)+=(str[j]-'0');a.pb(tmp);}}
static Num INF(){vector<BASE> x; x.clear();For(i,1,46) x.push_back(9999);return x;}
void operator= (const Num &x){a=x.a;}
void operator+= (const Num & rhs){if(*this==INF() || rhs==INF()){ *this=INF();return; }int r=max(a.size(),rhs.a.size());a.resize(r+1);For(i,0,r-1){if(i<signed(rhs.a.size())) a[i]+=rhs.a[i];a[i+1]+=a[i]/MOD;a[i]%=MOD;}while(a.size() && a[r]==0) a.pop_back(),r--;}
Num operator+ (const Num & rhs){Num tmp=*this; tmp+=rhs; return tmp; }
Num operator* (const Num & rhs){if(*this==INF() || rhs==INF()) return INF();int p=a.size(),q=rhs.a.size();vector<BASE> tmp;tmp.resize(p+q);For(i,0,p-1) For(j,0,q-1){tmp[i+j]+=a[i]*rhs.a[j];tmp[i+j+1]+=tmp[i+j]/MOD;tmp[i+j]%=MOD; }int len=p+q-1;while(tmp.size() && tmp[len]==0) tmp.pop_back(),len--;return tmp;}
void operator*= (const Num & rhs){*this=this->operator*(rhs);}
bool operator> (const Num &rhs)const{if(a.size()!=rhs.a.size()) {return a.size()>rhs.a.size();} else {int sz=a.size();ForDown(i,sz-1,0){ if(a[i]!=rhs.a[i]) return a[i]>rhs.a[i];} return 0;}}
bool operator== (const Num &rhs)const{return a.size()==rhs.a.size() && a==rhs.a;}
bool operator< (const Num &rhs)const{return !this->operator>(rhs)&&!this->operator==(rhs);}
};
ostream & operator<< (ostream & os, const Num &n){int sz=n.a.size()-1; if(sz<0){ os<<"0";return os; }os<<n.a[sz];ForDown(i,sz-1,0) os<<setw(9)<<setfill('0')<<n.a[i];return os;}
istream & operator>> (istream & is, Num &n){string str; is>>str;n=str;return is;}
il Num pow(Num x, int y){Num ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
// File head end
const ll mod=998244353;
int n,m,k,a[2005],cnt[2005];
ll C[2005][2005];
ll ans=0;
signed main()
{
read(n,m,k);
C[0][0]=C[0][1]=C[1][1]=1;
For(i,2,n)
{
For(j,1,i-1) C[j][i]=(C[j][i-1]+C[j-1][i-1])%mod;
C[0][i]=C[i][i]=1;
} // 预处理组合数
For(i,1,n)
{
read(a[i]);
cnt[a[i]]++;
}
For(i,2,m) cnt[i]+=cnt[i-1];
swap(cnt[m+1],cnt[0]);
For(i,1,m)
{
if(cnt[i-1]>=k || k+(cnt[i]-cnt[i-1]==0)-cnt[i-1]-1>cnt[m+1]) continue;
(ans+=C[(cnt[i]-cnt[i-1]==0)][cnt[m+1]]*C[1ll*k-cnt[i-1]-1][cnt[m+1]-(cnt[i]-cnt[i-1]==0)]%mod*qpow(1ll*m-i+1,1ll*cnt[m+1]-1ll*k-(cnt[i]-cnt[i-1]==0)+cnt[i-1]+1,mod)%mod*qpow(1ll*i,1ll*k-cnt[i-1]-1,mod)%mod*i%mod)%=mod;
// 选择方案*小于他的方案*大于它的方案
}
// cerr<<ans<<' '<<qpow(1ll*m,1ll*cnt[m+1],mod)<<endl;
ll mul=qpow(qpow(1ll*m,1ll*cnt[m+1],mod),mod-2,mod);
(ans*=mul)%=mod;
cout<<ans<<endl;
return 0;
}
样例 2 就挂了,似乎挂在 C[(cnt[i]-cnt[i-1]==0)][cnt[m+1]]*C[1ll*k-cnt[i-1]-1][cnt[m+1]-(cnt[i]-cnt[i-1]==0)] ?