min_max容斥
结论
推导
证明
S={x1,x2,x3,...}从大到小排序i=1,x1贡献为1i!=1,xi有选和不选两种方案,这两种方案一一对应系数相反,贡献为0Max(S)=x1
解决都出现的期望时间
[hdu4336]Card Collector
题意:
n张卡牌每张出现概率为pi,求所有卡牌都出完的期望次数
思路:
min很好求,
答案为 \
cpp
double p[25];
void solve(){
int n;
while(cin>>n){
for(int i=0;i<n;i++)cin>>p[i];
double ans=0;
for(int i=1;i<1<<n;i++){
double tmp=0;
int cnt=0;
for(int j=0;j<n;j++){
if(i>>j&1){
cnt++;
tmp+=p[j];
}
}
ans+=(cnt%2?1:-1)/tmp;
}
cout<<fixed<<setprecision(5)<<ans<<'\n';
}
}P4707 重返现世
题意:
有i种原料,第i种原料生成的概率为 ,求收集到任意k种的时间
思路:
- 获得任意k种相当于获得n-k+1大的物质
cpp
int f[20][10010],inv[10010],n,k,m,p[1010];
void solve(){
cin>>n>>k>>m;
k=n-k+1;
for(int i=1;i<=n;i++)cin>>p[i];
for(int i=(inv[1]=1)+1;i<=m;++i)inv[i]=inv[mod%i]*(mod-mod/i)%mod;
for(int i=1;i<=k;i++)f[i][0]=-1;
for(int i=1;i<=n;i++){
for(int j=m;j>=p[i];j--){
for(int kk=k;kk>=0;kk--){
f[kk][j]-=f[kk][j-p[i]];
if(kk)f[kk][j]+=f[kk-1][j-p[i]];
f[kk][j]%=mod;
f[kk][j]=(f[kk][j]+mod)%mod;
}
}
}
int ans=0;
for(int i=1;i<=m;i++)ans+=f[k][i]*m%mod*inv[i]%mod,ans%=mod;
cout<<ans<<"\n";
}