2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin 二项式定理

来源:互联网 发布:内部网络ip未使用查询 编辑:程序博客网 时间:2024/06/14 13:20

题意:

你有一枚硬币,然后抛出,落在地上,正面朝上的概率是p/q。现在你扔k次,问你正面朝上的次数是偶数次的概率。。。。

这道题做到崩溃,和队友一直再推偶数项概率和,可是就不会。

赛后看下题解,一下子就懂了,顿时想扇自己两个耳光。。。赤裸裸的二项式性质。。。

我们设朝上的概率是b,朝下的概率是a。

那么(a+b)^k恒等于1;

(a+b)^k的展开式是Ck0 a^k b^0 + Ck1 a^k-1 b^1+Ck2 a^k-2 b^2+.......

那么在列一个(a-b)^k,它的展开式是Ck0 a^k b^0 - Ck1 a^k-1 b^1+Ck2 a^k-2 b^2+.......

我们要求的是Ck0 a^k b^0+Ck2 a^k-2 b^2+Ck4 a^k-4 b^4+.......那么,直接将以上两个多项式相加就得到了。

至于(a-b)^k直接用快速幂求得。

代码:

#include<stdio.h>#include<iostream>using namespace std;#define mod 1000000007#define ll long longll pow(ll a, ll k){    ll ans=1;    while(k)    {        if(k&1)        {            ans=(ans%mod)*(a%mod)%mod;        }        a=(a*a)%mod;        k/=2;    }    return ans%mod;}ll ni(ll a){    return pow(a,mod-2);}int main(){    ll t;    ll p,q,k;    while(~scanf("%lld",&t))    {        while(t--)        {            scanf("%lld%lld%lld",&p,&q,&k);            ll a=pow(p-2*q,k);            ll b=pow(p,k);            a+=b;            b=2*b;            printf("%lld\n",(a%mod)*(pow(b,mod-2))%mod);费马小定理求逆元。        }    }}
经过这次,感觉自己实力还是弱,还是要不断努力,一个队不能只靠一个主力去战斗,自己也要变强。。。


阅读全文
0 0
原创粉丝点击