期望Ⅰ
比较简单的期望题
期望简单题。主要就是输出分数上面需要动那么一丢丢脑筋。
当然你要打表也可以哈【滑稽】。
考虑当前拥有的不同的瓶盖作为阶段划分,假如当前有 \(n\) 个不同的瓶盖,总共需要 \(m\) 个不同的瓶盖,那么很明显,下一次选中一个原来没有的瓶盖概率是 \(\dfrac{m-n}{m}\) ,那么期望便是 \(\dfrac{m}{m-n}\) ,最后的答案就是 \(\sum_{i=1}^{m}\frac{m-i}{m}\) ,然后硬算即可。
#include<cstdio>
#define int long long
struct num{
int a,b;//分子,分母
};
inline int gcd(int s1,int s2){
if(s2==0)return s1;
return gcd(s2,s1%s2);
}
inline int lcm(int s1,int s2){
return s1/gcd(s1,s2)*s2;
}
num operator *(num s1,num s2){
int nm=s1.b*s2.b;
int ns=s1.a*s2.a;
int g=gcd(nm,ns);
return (num){ns/g,nm/g};
}
num operator +(num s1,num s2){
int nm=s1.b*s2.b;
int ns=s1.a*s2.b+s1.b*s2.a;
int g=gcd(nm,ns);
return (num){ns/g,nm/g};
}
void print(int wh,char w){
while(wh){
putchar(w);
wh/=10;
}
return;
}
signed main(){
int m;
scanf("%lld",&m);
num now=(num){0,1};
for(int i=1;i<=m;i++){
now=now+(num){1,i};
}
now=now*(num){m,1};
int zheng=now.a/now.b;
now.a%=now.b;
if(now.a==0){
printf("%lld",zheng);
return 0;
}
print(zheng,' ');
printf("%lld\n",now.a);
printf("%lld",zheng);
print(now.b,'-');
putchar('\n');
print(zheng,' ');
printf("%lld",now.b);
return 0;
}
理论上来说是一道……线性DP?
推方程即可。连数组都不用,纯线性。从 \((x+1)^3=x^3+3\times x^2+3\times x+1\)出发,对一次项、二次项分别维护期望即可。
#include<cstdio>
//#define zczc
const int N=100010;
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
int m;
double p,le0=0,le1=0,le2=0,ne0=0,ne1=0,ne2=0;
scanf("%d",&m);
while(m--){
scanf("%lf",&p);
ne0=(le0+1)*p;
ne1=(le1+2*le0+1)*p;
ne2=(3*le1+3*le0+1)*p+le2;
le0=ne0,le1=ne1,le2=ne2;
}
printf("%.1f",ne2);
return 0;
}
一如既往,万事胜意