关于二项式定理,偶数项和的求解方法。

题目

问题引入

给你一个古典概型问题,总共两个事件,发生A事件的概率为p,则发生B事件的概率为1-p;求k次操作之后,出现偶数次A事件的概率为多少。对于最后的答案要取模1e9+7。
题库链接 <<

样例输入

2
2 1 1
3 1 2

样例输出

500000004
555555560

题目来源

2017 ACM-ICPC 亚洲区(西安赛区)网络赛

题解

  • 很显然,答案是求二项式的偶数项和。
    这里写图片描述
  • 对于这种求偶数项的和,可以参照对于n的所有组合数C(n, i)求得奇数项和为2^(n-1),偶数项和为2^(n-1)的方法,如下所示:
    关于二项式定理,偶数项和的求解方法。_第1张图片
  • 综上,二项式偶数项和的通项公式为:
    • ans=(p^k+(2*q-p)^k)/(2*p^k) ;
#include
#include
#include
#include
using namespace std;

const int mod=1e9+7;
const double eps=1e-8;

typedef long long LL;
LL pow_mod(LL a,LL b,LL p) //快速幂取模
{
    LL ans=1,base=a;
    while(b>0)
    {
        if(b&1) //n%2==1
            ans=ans*base%p;
        base=base*base%p;
        b>>=1;// b/=2
    }
    return ans;
}
LL cal(LL x,LL y)//分数取模
{
    return x*pow_mod(y,mod-2,mod)%mod;
}
int main()
{
    int T;
    LL p,q,k;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&p,&q,&k);
        q=pow_mod(p-2*q,k,mod);
        p=pow_mod(p,k,mod);
        q=(p+q)%mod;
        p=(p*2)%mod;
        printf("%lld\n",cal(q,p));
    }
    return 0;
}

你可能感兴趣的:(C/C++,数论,二项式偶数项和,分数取模)