1.题目描述:点击打开链接
2.解题思路:本题是杨辉三角的应用。演算后不难发现,n个数相乘,每一项的系数就是第n-1行对应的杨辉三角的系数。不过考虑到这里的n会非常大,因此不能直接计算出对应的组合数,而是需要事先取自然对数,最后累加答案的时候再恢复出来。
3.代码:
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<complex>
#include<functional>
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define rep(i,n) for(int i=0;i<(n);i++)
#define me(s) memset(s,0,sizeof(s))
#define pb push_back
#define lid (id<<1)
#define rid (id<<1|1)
typedef long long ll;
typedef pair<int,int> P;
const int N=50000+5;
double a[N];
int main()
{
int T;
int rnd=0;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
double val;
scanf("%lf",&val);
double ln2=(n-1)*log(2),lnc=0;
double ans=0;
if(val>0) ans+=exp(log(val)+lnc-ln2);
else ans-=exp(log(-val)+lnc-ln2);
for(int i=1;i<n;i++)
{
scanf("%lf",&val);
lnc+=log(n-i)-log(i);
if(val>0)ans+=exp(log(val)+lnc-ln2);
else ans-=exp(log(-val)+lnc-ln2);
}
printf("Case #%d: %.3lf\n",++rnd,ans);
}
}