1.多重集排列
多重集概念
多重集排列
例题-擅长解密的小红同学
首先找到总共序列数,也就是上述的A,
随后求期望值(证明如下)最后发现期望值为A
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1e9+7;
int a[10];
inline ll qpow(ll x,ll n){
ll ans=1;
while(n){
if(n&1)ans=ans*x%p;
n>>=1;
x=x*x%p;
}
return ans;
}
inline ll inv(ll x){ return qpow(x,p-2); }
ll f(ll x){//求阶乘
ll ans=1;
for(ll i=2;i<=x;i++)
ans=ans*i%p;
return ans;
}
int main(){
ll ans=1,sum=0;
for(int i=0;i<10;i++){
cin>>a[i];
sum+=a[i];
}
ans=ans*f(sum);
for(int i=0;i<10;i++){
ans=ans*inv(f(a[i]))%p;
}
cout<<ans;
return 0;
}
2.期望dp
例题-Little Pony and Expected Maximum
若n次投掷的点数都在1到k内,共有k^n种情况。
若n次投掷的点数都在1到k-1内,共有(k-1)^n种情况。
也就是说如果投n次,最大点数是k,那么情况共有k^n-(k-1)^n种。
![]()
然后就可以愉快AC了
#include<bits/stdc++.h>
using namespace std;
int m,n;
int main(){
cin>>m>>n;
double ans=m;
for(int i=1;i<m;i++)
ans-=pow((i*1.0/m),n);
cout<<ans;
return 0;
}