题解:定义,S表示1-n的子集。求E(F(S)| |S|==k ) 求长度为k的子集S,关于F(S)的期望。显然答案是。当k-1大于n-i时为0。这个式子就是枚举min(S)是多少,求出对应的子集个数。分母是固定,不妨我们设:。这里我们需要枚举n次,又因为本题n很大,所以这么做是没有前途的。
考虑做转化,因组合数满足递推式,。
所以。
打开整理有:
因为An=0,不妨不停的迭代整理出Ak的表达式。
即:。
由二项式定理:
所以:
这样的化只用O(k)就行了。考试并没有看出递推的转换,这题真难。
#include<bits/stdc++.h>
#define ll long long
#define M 998244353
using namespace std;
const int N=1e7+10;
ll fac[N],inv[N];
int k,n,t;
ll qpow(ll a,int b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%M;
b>>=1;a=a*a%M;
}
return ans%M;
}
inline void init(){
fac[0]=inv[0]=1;
for(int i=1;i<=k;i++) fac[i]=fac[i-1]*i%M;
inv[k]=qpow(fac[k],M-2);
for(int i=k;i;i--) inv[i-1]=inv[i]*i%M;
}
int main(){
// freopen("a.in","r",stdin);
scanf("%d%d%d",&n,&k,&t);
if(t==1){
printf("1\n");return 0;
}
init();
ll ans=qpow(t,n);ll pw=1,cur=1;
for(int i=0;i<k;i++){
(ans-=pw*cur%M*inv[i]+M)%=M;
cur=cur*(n-i)%M;
pw=pw*(t-1)%M;
}
ans=ans*t%M*qpow(qpow(t-1,k),M-2)%M;
ans=(ans*qpow(cur*inv[k]%M,M-2)%M+M)%M;
printf("%lld\n",ans);
return 0;
}