U332154 carbon 题解(期望)

这题其实挺简单的......

首先我们手模样例,对于第一组样例其实就是在1-n之间取一个数,求取到的数的期望。所以E(x)=1+n2

对于第二组样例,我们首先将所有可能情况枚举出来:

10 10 10 10 10 10 10 10 10 10

9 9 9 9 9 9 9 9 9 10

8 8 8 8 8 8 8 8 9 10

7 7 7 7 7 7 7 8 9 10

6 6 6 6 6 6 7 8 9 10

5 5 5 5 5 6 7 8 9 10

4 4 4 4 5 6 7 8 9 10

3 3 3 4 5 6 7 8 9 10

2 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

这行10可太突兀了

我们可以惊奇地发现它是一层包一层的,而对于每个数i,它在数组中出现了i2(i1)2次,所以他对期望的贡献就是
i(i2(i1)2)=i((i+(i1))(i(i1)))=i(2i1)=2i2i
所以E(x)=212+222+232+...+2n212...nn2=2n(n+1)(2n+1)6n(n+1)2n2

所以答案就是2511755100=7.15

考虑拓展成m维的矩阵:
对于每个数i,它在数组中出现了im(i1)m次,所以它对答案的贡献就是i(im(i1)m)=iimi(i1)m

所以E(x)=11m+22m+...+nnm1(11)m2(21)m...n(n1)mnm

=11m+22m+...+nnm10m21m...n(n1)mnm

=nnm1m2m...(n1)mnm

到这里好像已经能对付这个数据了,但是1e6^1e6大约有61e6位,是肯定开不下的,我们不妨对公式进行变型

E(x)=n(1n)m(2n)m...(n1n)m

这样就可以啦,公式符合直觉,因为当m很大时E(x)接近n

#include<bits/stdc++.h>
using namespace std;
long long T,n,m;
double qpow(double b,long long p){
	double ans=1,t=b;
	while(p!=0){
		if(p&1){
			ans*=t;
		} 
		t=t*t;
		p=p>>1; 
	} 
	return ans;
} 
int main(){
	cin>>n>>m;
	double sum=0;
	for(int i=1;i<=n-1;i++){
		sum+=qpow(i*1.0/n,m);
	}
	printf("%.2lf\n",n-sum);
	
	return 0;
}
posted @   wuhupai  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示