设kMAX-MIN反演有反演系数函数 f ( ∣ S ∣ ) f(|S|) f(∣S∣),使得
k M A X ( S ) = ∑ T = ̸ ∅ , T ⊂ S f ( ∣ T ∣ ) M I N ( T ) kMAX(S)=\sum_{T =\not \emptyset,T \subset S} f(|T|)MIN(T) kMAX(S)=T≠∅,T⊂S∑f(∣T∣)MIN(T)
假设 S S S集合里有 n n n个数,分别是 a 1 , a 2 . . . a n a_1,a_2...a_n a1,a2...an,且 a 1 ≤ a 2 ≤ . . . ≤ a n a_1 \leq a_2 \leq ... \leq a_n a1≤a2≤...≤an,那么第 k k k大值为 a n − k + 1 a_{n-k+1} an−k+1。
M I N ( T ) = a i MIN(T)=a_i MIN(T)=ai的 T T T,满足 T T T中最小元素为 a i a_i ai,所以有:
∑ i = 0 n − x C n − x i f ( i + 1 ) = [ x = n − k + 1 ] \sum_{i=0}^{n-x} C_{n-x}^i f(i+1)=[x=n-k+1] ∑i=0n−xCn−xif(i+1)=[x=n−k+1]
上二项式反演得到:
f ( x + 1 ) = ∑ i = 0 x ( − 1 ) x − i C x i [ i = k − 1 ] = ( − 1 ) x − k + 1 C x k − 1 f(x+1)=\sum_{i=0}^{x} (-1)^{x-i}C_x^i[i=k-1]=(-1)^{x-k+1}C_x^{k-1} f(x+1)=∑i=0x(−1)x−iCxi[i=k−1]=(−1)x−k+1Cxk−1
综上, f ( x ) = ( − 1 ) x − k C x − 1 k − 1 f(x)=(-1)^{x-k}C_{x-1}^{k-1} f(x)=(−1)x−kCx−1k−1
答案就是
∑ T = ̸ ∅ ( − 1 ) ∣ T ∣ − K C ∣ T ∣ − 1 K − 1 m ∑ i ∈ T p i \sum_{T =\not \emptyset}(-1)^{|T|-K}C_{|T|-1}^{K-1}\frac{m}{\sum_{i \in T}p_i} T≠∅∑(−1)∣T∣−KC∣T∣−1K−1∑i∈Tpim
不难发现本题的 k k k应该转化为第 n − k + 1 n-k+1 n−k+1小值,而 n − k ≤ 10 n-k \leq 10 n−k≤10,所以 n − k + 1 ≤ 11 n-k+1 \leq 11 n−k+1≤11。再加上 n n n和 m m m都不大,大胆猜想应该把它们都算进复杂度中。
设 f ( j , k ) f(j,k) f(j,k)表示,对于当前考虑到的 ∑ i ∈ T p i = j \sum_{i \in T}p_i=j ∑i∈Tpi=j的集合,当 K = k K=k K=k时,它们的容斥系数(反演系数)的和。
一个个考虑每种物品,如果不选择第 i i i种物品: f ( j , k ) + = f ′ ( j , k ) f(j,k)+=f'(j,k) f(j,k)+=f′(j,k)
如果选择,首先是 − 1 -1 −1的次方改变,这个很好办。然后组合数的问题, C ∣ T ∣ − 1 K − 1 = C ∣ T ∣ − 2 K − 1 + C ∣ T ∣ − 2 K − 2 C_{|T|-1}^{K-1}=C_{|T|-2}^{K-1}+C_{|T|-2}^{K-2} C∣T∣−1K−1=C∣T∣−2K−1+C∣T∣−2K−2,所以综上, f ( j , k ) + = − f ( j − p i , k ) + f ( j − p i , k − 1 ) f(j,k)+=-f(j-p_i,k)+f(j-p_i,k-1) f(j,k)+=−f(j−pi,k)+f(j−pi,k−1)。
至于边界,是一个被构造了的,很妙的 f ( 0 , 0 ) = 0 , f ( 0 , k ) = − 1 f(0,0)=0,f(0,k)=-1 f(0,0)=0,f(0,k)=−1的边界。不过也可以预处理一维的边界啥的。
#include
using namespace std;
#define RI register int
const int mod=998244353;
int n,K,m,ans;
int p[1005],inv[10005],f[2][10005][13];
int qm(int x) {return x>=mod?x-mod:x;}
int main()
{
scanf("%d%d%d",&n,&K,&m);
K=n-K+1;
for(RI i=1;i<=n;++i) scanf("%d",&p[i]);
inv[1]=1;for(RI i=2;i<=m;++i) inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
for(RI i=1;i<=K;++i) f[0][0][i]=mod-1;
for(RI i=1,t=1,lim=0;i<=n;++i,t^=1) {
for(RI j=0;j<=lim;++j)
for(RI k=1;k<=K;++k) {
if(!f[t^1][j][k]) continue;
f[t][j][k]=qm(f[t][j][k]+f[t^1][j][k]);
f[t][j+p[i]][k+1]=qm(f[t][j+p[i]][k+1]+f[t^1][j][k]);
f[t][j+p[i]][k]=qm(f[t][j+p[i]][k]-f[t^1][j][k]+mod);
f[t^1][j][k]=0;
}
lim+=p[i];
}
for(RI i=1;i<=m;++i) ans=qm(ans+1LL*inv[i]*f[n&1][i][K]%mod);
ans=1LL*ans*m%mod;
printf("%d\n",ans);
return 0;
}