题解:P12010 【MX-X10-T6】[LSOT-4] 集合
VinstaG173 · · 题解
问候出题人环节:直接出
记答案为
首先发现问题具有对称性,
-
-
- 其余情况,由于
|S|\le m ,故|S| 或者只能划分成全为单点集,或者没有划分方案,条件退化,可以任取一个其中元素为代表元且对其他子集的代表元取值无影响。
综上,对于满足
展开后合并同样底数,由组合数前缀和公式,得到封闭形式:
组合数在指数上,要
Code:
#define ll long long
const int ntf=1e9+87;
inline ll qpw(ll x,int v,int mod=ntf){
ll r=1;while(v){
(v&1)&&(r=r*x%mod);
x=x*x%mod,v>>=1;
}return r;
}
const int p[5]={2,3,41,59,68899};
int v[5];
ll fac[5][70003];
ll fic[5][70003];
ll __C(int i,int m,int k){
if(m<k)return 0;
return fac[i][m]*fic[i][k]%p[i]*fic[i][m-k]%p[i];
}ll _C(int i,int m,int k){
if(m<k)return 0;
if(m<p[i])return __C(i,m,k);
return _C(i,m/p[i],k/p[i])*__C(i,m%p[i],k%p[i])%p[i];
}inline ll C(int m,int k){
if(m<k)return 0;
ll res=0;
for(int i=0;i<5;++i)
res=(res+_C(i,m,k)*v[i])%(ntf-1);
return res;
}
int n,m,sum;ll ans;
inline void solve(){
for(int i=0;i<5;++i){
fac[i][0]=1;
for(int j=1;j<p[i];++j)
fac[i][j]=fac[i][j-1]*j%p[i];
fic[i][p[i]-1]=p[i]-1;
for(int j=p[i]-1;j;--j)
fic[i][j-1]=fic[i][j]*j%p[i];
v[i]=(ntf-1)/p[i]*qpw((ntf-1)/p[i]%p[i],p[i]-2,p[i]);
}cin>>n>>m;ans=1;
if(m==1){
for(int k=2;k<=n;++k)
ans=ans*qpw(k,C(n,k))%ntf;
cout<<ans<<"\n";return;
}for(int k=2;k<=m;++k)
ans=ans*qpw(k,C(m,k))%ntf;
for(int i=n;i>m;--i)ans=ans*i%ntf;
for(int k=3;k<=m;++k){sum=0;
ans=ans*qpw(k,C(min(k+m-2,n),k)-C(m,k)+ntf-1)%ntf;
}cout<<ans<<"\n";
}