2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B.Coin(基本概率+二项式展开)

Posted ITAK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B.Coin(基本概率+二项式展开)相关的知识,希望对你有一定的参考价值。

传送门

Bob has a not even coin, every time he tosses the coin, the probability that the coin’s front face up is qp(qp12) .

The question is, when Bob tosses the coin k times, what’s the probability that the frequency of the coin facing up is even number.

If the answer is XY, because the answer could be extremely large, you only need to print (XY1)mod(109+7) .

Input Format

First line an integer T , indicates the number of test cases (T100).

Then Each line has 3 integer p,q,k(1p,q,k107) indicates the i-th test case.

Output Format

For each test case, print an integer in a single line indicates the answer.




样例输入


2 
2 1 1
3 1 2



样例输出


500000004 
555555560

题目大意:

Bob有一个不公平的硬币,正反的概率是不一样的,现在给出这个硬币朝上的概率为 pq ,现在求抛 k 次之后正面朝上的概率是多少,输出的是 XY1,就是求分母关于 MOD 的逆元。

解题思路:
根据概率所学的知识,很容易想到的是分母为 fenmu=pk ,分子为: fenzi=ki=0Cikqi(pq)ki(i)
根据二项式定理有:
现在有 (q+pq)k=ki=0Cikqi(pq)ki(1)
设有: (q(pq))k=ki=0Cikqi(1)ki(pq)ki(2)
那么我们发现:
k 是奇数的时候 (1)(2)=fenzi
k 是偶数的时候 (1)+(2)=fenzi
显然分子可求,最后在乘以分母关于 mod 的逆元就OK了。

代码:

#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <map>
using namespace std;
typedef long long LL;
const int MAXN = 1e6+5;
const double PI = acos(-1);
const double eps = 1e-8;
const LL MOD = 1e9+7;
LL Pow(LL a, LL b)
    LL ans = 1;
    while(b)
        if(b & 1) ans = ans * a % MOD;
        b>>=1;
        a = a * a % MOD;
    
    return ans;

void Exgcd(LL a, LL b, LL &x, LL &y)
    if(b == 0)
        x = 1;
        y = 0;
        return ;
    
    LL x1, y1;
    Exgcd(b, a%b, x1, y1);
    x = y1;
    y = x1-(a/b)*y1;

int main()
    //freopen("C:/Users/yaonie/Desktop/in.txt", "r", stdin);
    //freopen("C:/Users/yaonie/Desktop/out.txt", "w", stdout);
    int T; scanf("%d", &T);
    while(T--)
        LL p, q, k; scanf("%lld%lld%lld",&p,&q,&k);
        LL tmp1 = Pow(2*q-p, k);
        LL tmp2 = Pow(p, k);
        int flag = 1;
        if(k & 1) flag = -1;
        LL fenzi = (tmp2+flag*tmp1)%MOD*500000004LL%MOD;
        LL x, y;
        Exgcd(p, MOD, x, y);
        x = (x%MOD+MOD)%MOD;
        LL ans = Pow(x, k)*fenzi%MOD;
        printf("%lld\\n",ans);
    
    return 0;

以上是关于2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B.Coin(基本概率+二项式展开)的主要内容,如果未能解决你的问题,请参考以下文章

2017 ACM-ICPC 亚洲区(西安赛区)网络赛: B. Coin 概率题

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

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B.Coin(基本概率+二项式展开)

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F.Trig Function(论文+组合数)

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B题 Coin 题解

017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin 概率+矩阵快速幂