UVA 10883 Supermean 上下取对数防溢出

题目链接:点击打开链接

溢出了半天,觉累不爱

#include<math.h>
#include<iostream>
#include<stdio.h>
using namespace std;
#define ll int

int main(){
	ll Cas=  1, T; cin>>T;
	while(T--){
		ll n;
		cin>>n;
		double sum = 0, a;
		double hehe = 0;
		for(ll i = 0; i < n;i++){
			cin>>a;
			if(a<0) sum-=exp(hehe+log(-a)-(n-1)*log(2));
			else sum += exp(hehe+log(a)-(n-1)*log(2));
			hehe+=log(n-1-i)-log(i+1);
		}
		printf("Case #%d: %.3lf\n",Cas++,sum);
	}
	return 0;
}

UVA 10883 Supermean 上下取对数防溢出

时间: 2024-08-25 07:35:14

UVA 10883 Supermean 上下取对数防溢出的相关文章

UVA - 10883 Supermean

Description Problem F Supermean Time Limit: 2 second "I have not failed. I've just found 10,000 ways that won't work." Thomas Edison Do you know how to compute the mean (or average) of n numbers? Well, that's not good enough for me. I want the s

UVA 10883 - Supermean(组合数学+数值优化)

题目链接:10883 - Supermean 题意:求超级平均数,就是相邻两个算一个平均数,直到剩下一个数,求数值. 思路:画图很容易推断出公式.就拿最后一组样例来说 1     2      3      4      5 1.5  2.5   3.5   4.5 2       3      4 2.5   3.5 3 观察可以发现都是从顶到底,看又几条路线,就有几次,然后最后每个数字在除上相应次数的2,那几条路线就是C(n - 1, [0 - n - 1])的组合数. 所以ans = su

uva 10883 - Supermean(组合数学+数值优化)

题目链接:uva 10883 - Supermean 题目大意:给出n个数,每相邻两个数求平均数,将得到n-1个数,这n-1个数每相邻的两个数求平均值,将得到n-2个数.一次类推,求最后得到的那个数的值. 解题思路:类似与杨辉三角,第i个数起始被加了C(n?1i?1)次.总共有2n?1个数相加.但是因为n有50000,250000根本存不下,所以借助log函数. 例: 中间的2可以通过蓝色和红色两条路径影响最后的答案. #include <cstdio> #include <cstrin

poj2661 Factstone Benchmark(大数不等式同取对数ji)

这道题列出不等式后明显是会溢出的大数,但是没有必要写高精度,直接两边取对数(这是很简明实用的处理技巧)得: log2(n!)=log2(n)+log2(n-1)+...+log2(1)<=log2(2k-1)<k 其中k是第y年计算机的位数. 注意C++中log(n)是以e为底的对数,log10(n)是以10为底的对数,若要计算loga(b),用换底公式loga(b)=logx(b)/logx(a)即可. #include<iostream> #include<cstdio&

【数据处理】为什么数据要取对数

平时在一些数据处理中,经常会把原始数据取对数后进一步处理.之所以这样做是基于对数函数在其定义域内是单调增函数,取对数后不会改变数据的相对关系,取对数作用主要有:1. 缩小数据的绝对数值,方便计算.例如,每个数据项的值都很大,许多这样的值进行计算可能对超过常用数据类型的取值范围,这时取对数,就把数值缩小了,例如TF-IDF计算时,由于在大规模语料库中,很多词的频率是非常大的数字. 2. 取对数后,可以将乘法计算转换称加法计算. 3. 某些情况下,在数据的整个值域中的在不同区间的差异带来的影响不同.

HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)

You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The problem is that if there exist N numbers a1, a2, … an and M numbers b1, b2, …, bm, which satisfies that each elements in row-i multiplied with ai and e

UVa 10883 超级平均数(二项式系数+对数计算)

https://vjudge.net/problem/UVA-10883 题意: 给出n个数,每相邻两个数求平均数,依次类推,最后得到1个数,求该数. 思路: 演算一下可以发现最后各个数的系数就是二项式系数. 但是n太大,直接计算会溢出. 所以,这里要用对数计算.(cmath中的log默认以e为底) 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio>

uva 1639--精度处理方法之取对数对数(uva 1639)

1639 - Candy Time limit: 3.000 seconds 1639 CandyLazyChild is a lazy child who likes candy very much. Despite being very young, he has two large candy boxes, each contains n candies initially. Everyday he chooses one box and open it. He chooses the ?

uva - 10833 Supermean(二项式系数,对指数)

模拟发现,每个元素求和时,元素的系数是二项式系数,于是ans=sum(C(n-1,i)*a[i]/2^(n-1)),但是n太大,直接求会溢出,其实double的范围还是挺大的,所以可以将组合数转化成对数: e^(lnC(n-1, k)*A[k]/(2^n-1) )  ==>  e^( ln C(n-1,k) + ln A[k] - (n-1)*ln2 ); 又直接利用公式求二项式系数:C(n, k+1)/C(n, k) = (n-k)/(k+1); 而且对数还有递推求法: logC(n,k+1)