UVA 10883 - Supermean(杨徽三角 对数处理大数除大数)

题目链接

10883 - Supermean

分析

模拟一下发现只需要计算每个数字被加了多少次,最后用来除以 2n1 ,即

ans=n1i=0(n1i)a[i]2n1

需要注意的是对两个大数的处理 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值