UVA - 10883 (数学——二项式应用)

对二项式的复习:

  1. 这里写图片描述
  2. 如果a==1&&b==1,那么可以得出C(n,1)+C(n,2)+C(n,3)+…….+C(n,n)=2^n
  3. 如果a==1&&b==-1,那么C(n,0)-C(n,1)+C(n,2)-C(n,3)+……(-1)^n*C(n,n)=0
  4. C(n,0)+C(n,2)+C(n,4)+……=C(n,1)+C(n,3)+C(n,5)+……=2^(n-1)
  5. Cnk=n!/(n-k)!/k!
    题目链接:
    https://vjudge.net/problem/UVA-10883
    分析:
    多谢两组数据可以看出其系数满足杨辉三角;则ans=sum(C(n-1,i)*a[i])/(2^(n-1)),因为n太大,2^(n-1)存储不下,故用对数存储。即ans=sum(pow(2,log2^(C(n-1,i))+log2^a[i]-(n-1)));
    先处理log2^(C(n-1,i))=log2^((n-1)!/(n-1-i)!/i!;
    那么log2^(C(n-1,i-1))=log2^( (n-1)!/(n-i)!/(i-1)! );
    令f[i]代表log2^(C(n-1,i)),则log_2_C[i]/log_2_C[i-1]=log2^(n-i)/i=log2^(n-i)-log2^i;
    得出递推公式: f[i]=f[i-1]+log2^(n-i)-log2^i;
    代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=50000+5;
double log_2_C[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    int kase=0;
    while(T--)
    {
        memset(log_2_C,0,sizeof(log_2_C));
        int n;
        scanf("%d",&n);


        //得出C(n-1,i)
        log_2_C[0]=1;
        for(int i=1;i<=n;i++)
        {
            log_2_C[i]=log_2_C[i-1]+log(n-i)/log(2)-log(i)/log(2);
        }
        double x;
        double res=0;

        for(int i=0;i<n;i++)
        {
            scanf("%lf",&x);
            if(x>0)                //如果x大于0
            {
                res+=pow(2,(log(x)/log(2)+log_2_C[i]-n+1));
            }
            else                  //如果x小于0
                res-=pow(2,(log(-x)/log(2)+log_2_C[i]-n+1));
        }
         printf("Case #%d: %.3lf\n",++kase,res/2);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值