原题链接: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 pq(pq≤21).
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 YX, because the answer could be extremely large, you only need to print (X∗Y−1)mod(109+7).
Input Format
First line an integer T, indicates the number of test cases (T≤100).
Then Each line has 3 integer p,q,k(1≤p,q,k≤107) 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+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);
}
}