找规律可得答案为k=C(n-1,i)*a[i]/2^n-1 (0<=i<=n-1) 但由于n太大会溢出,所以使用log法 即k=logC(n-1,i)+loga[i]-(n-1)log2 最后再用exp(k)还原
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 1000000007
using namespace std;
double a[50005],log_c[50005];
int main(){
int T,n;
double ans,c;
cin>>T;
for(int k=1;k<=T;k++){
cin>>n;
log_c[0]=0;
for(int i=1;i<n;++i){
log_c[i]=log_c[i-1]+log(n-i)-log(i);
}
c=0;ans=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>0) ans+=exp(log_c[i]+log(a[i])-(n-1)*log(2));
else if(a[i]<0) ans-=exp(log_c[i]+log(-a[i])-(n-1)*log(2));
}
printf("Case #%d: %.3lf\n",k,ans);
}
return 0;
}