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;
}