题目链接
分析
模拟一下发现只需要计算每个数字被加了多少次,最后用来除以
2n−1
,即
ans=∑n−1i=0(n−1i)∗a[i]2n−1
需要注意的是对两个大数的处理 n=exp(log(n)) 这样就避开了大数的除法.细节请看代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <bitset>
#include <cmath>
#include <iomanip>
#define INF 0x3f3f3f3f
#define fi first
#define se second
#define eps 1e-6
using namespace std;
typedef pair<long double,long double> Pair;
typedef long long LL;
const int maxn = 1e5+10;
const int MOD = 1e6+7;
double a[maxn];
int main()
{
int T;
cin>>T;
for(int kase = 1 ; kase <= T ; ++kase){
int n;
cin>>n;
for(int i=0 ; i<n ; ++i)cin>>a[i];
double d = pow(2,n-1);
//std::cout << "d = " << d<<"\n";
double ans = 0;
double ln2 = (n-1)*log(2.0);
double ln_comb = 0;
for(int i =0 ; i<n ; ++i){
//std::cout << exp(ln_comb) << '\n';
if(a[i]>0)ans+= exp(ln_comb+log(a[i])-ln2);
else if(a[i]<0)ans-=exp(ln_comb+log(-a[i])-ln2);
// std::cout << comb << '\n';
ln_comb = ln_comb+log(n-1-i)-log(i+1);
}
printf("Case #%d: %.3lf\n",kase,ans );
}
return 0;
}