期望Ⅰ

比较简单的期望题

期望简单题。主要就是输出分数上面需要动那么一丢丢脑筋。

当然你要打表也可以哈【滑稽】。

考虑当前拥有的不同的瓶盖作为阶段划分,假如当前有 \(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;
}
posted @ 2021-08-25 16:50  Feyn618  阅读(55)  评论(0编辑  收藏  举报