U332154 carbon 题解(期望)

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

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

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

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,它在数组中出现了\(i^2-(i-1)^2\)次,所以他对期望的贡献就是
\(i*(i^2-(i-1)^2)=i*((i+(i-1))*(i-(i-1)))=i*(2i-1)=2*i^2-i\)
所以\(E(x)=\frac{2*1^2+2*2^2+2*3^2+...+2*n^2-1-2-...-n}{n^2}=\frac{2*\frac{n*(n+1)*(2n+1)}{6}-\frac{n*(n+1)}{2}}{n^2}\)

所以答案就是\(\frac{2*5*11*7-55}{100}=7.15\)

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

所以\(E(x)=\frac{1*1^m+2*2^m+...+n*n^m-1*(1-1)^m-2*(2-1)^m-...-n*(n-1)^m}{n^m}\)

\(=\frac{1*1^m+2*2^m+...+n*n^m-1*0^m-2*1^m-...-n*(n-1)^m}{n^m}\)

\(=\frac{n*n^m-1^m-2^m-...-(n-1)^m}{n^m}\)

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

\(E(x)=n-(\frac{1}{n})^m-(\frac{2}{n})^m-...-(\frac{n-1}{n})^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 @ 2024-02-27 10:11  wuhupai  阅读(1)  评论(0编辑  收藏  举报