非等概率的抛硬币抛一次正面向上的概率是
p
=
a
b
p=\frac{a}{b}
p=ba,问你抛k次偶数数次正面向上的概率是多少,答案
X
Y
\frac{X}{Y}
YX是模意义下的整数。
首先可以得到答案
$
\sum_{i=0(i是偶数)}^{k}{p*(1-p)}
$
这里关键就是处理偶数次。然后我们回忆一下二项式展开里面常用的两种展开方式
T1=
(
a
+
b
)
n
=
∑
a
i
∗
b
k
−
i
{(a+b)}^n=\sum{a^i*b^{k-i}}
(a+b)n=∑ai∗bk−i
T2=
(
−
a
+
b
)
n
=
∑
(
−
a
)
i
∗
b
k
−
i
{(-a+b)}^n=\sum{(-a)^i*b^{k-i}}
(−a+b)n=∑(−a)i∗bk−i
T
1
+
T
2
2
\frac{T1+T2}{2}
2T1+T2得到偶数项,
T
1
−
T
2
2
\frac{T1-T2}{2}
2T1−T2得到奇数项。接着就是用逆元代替除法,按照以上的式子进行计算就好了。
关于逆元可以去看这篇博客[link]https://www.cnblogs.com/Judge/p/9383034.html#_label3_1_2_1
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL read()
{
LL kk=0,f=1;
char cc=getchar();
while(cc<'0'||cc>'9'){if(cc=='-')f=-1;cc=getchar();}
while(cc>='0'&&cc<='9'){kk=(kk<<1)+(kk<<3)+cc-'0';cc=getchar();}
return kk*f;
}
const int mod=1e9+7;
LL qp(LL a,LL b)
{
LL kk=1;
while(b)
{
if(b&1)kk*=a;kk%=mod;
a*=a;a%=mod;
b>>=1;
}
return (kk%mod+mod)%mod;
}
LL ni(LL x)
{
x%=mod;
LL lin=qp(x,mod-2);
return (lin%mod+mod)%mod;
}
int main()
{
int T=read();
for(int ii=1;ii<=T;++ii)
{
LL a,b,k;b=read();a=read();k=read();
LL ans;
ans=(qp(b,k)+qp(b-2*a,k))%mod;//分子那部分
ans=ans*ni(2*qp(b,k))%mod;//逆元(分母)
ans=(ans+mod)%mod;
cout<<ans<<endl;
}
return 0;
}