您的位置:首页 > 理论基础 > 计算机网络

Coin 2017ICPC西安网络赛

2018-04-10 04:38 197 查看
原题链接:https://nanti.jisuanke.com/t/17115
Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face up is \frac{q}{p}(\frac{q}{p}
\le \frac{1}{2})​p​​q​​(​p​​q​​≤​2​​1​​).
The question is, when Bob tosses the coin kk times,
what's the probability that the frequency of the coin facing up is even number.

If the answer is \frac{X}{Y}​Y​​X​​,
because the answer could be extremely large, you only need to print (X
* Y^{-1}) \mod (10^9+7)(X∗Y​−1​​)mod(10​9​​+7).

Input Format

First line an integer TT,
indicates the number of test cases (T
\le 100T≤100).

Then Each line has 33 integer p,q,k(1\le
p,q,k \le 10^7)p,q,k(1≤p,q,k≤10​7​​) 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


题意:一枚不均匀的硬币,正面朝上的概率为q/p,这枚硬币抛了k次,求正面朝上的次数是偶数次的概率mod 10000000007

思路:由二项分布公式可以计算正面朝上是偶数次的概率,但是直接用二项分布公式不好写,而且会超时。我们可以将二项分布公式用二项式定理表示,对二项式进行化简。

二项式为:([ (q/p+1-q/p)^n+(q/p-(1-q/p))^n]/2)%mod  

化简为[1+(p-2q)^n*(p^n)^(mod-2)%mod]*2^(mod-2)%mod;

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
ll p,q,k;
ll pow_m(ll x,ll y)
{
ll ret=1,t=x%mod;
while(y)
{
if(y&1)
{
ret*=t;
ret%=mod;
}
y>>=1;
t*=t;
t%=mod;
}
return ret;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&p,&q,&k);
ll ans=1+pow_m(p-2*q,k)*pow_m(pow_m(p,k),mod-2);
//printf("%lld\n",ans);
ans=ans%mod;
ans=ans*pow_m(2,mod-2);
ans%=mod;
printf("%lld\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: