假设一个硬币正面朝上的概率为q/p,则扔k次,偶数次朝上的概率为:
当然这里得用到逆元的算法:可点击以下链接学习逆元:逆元用法
下面今天的比赛例题:
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B
带入公式即可:
代码如下:
---
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
ll pow_mod(ll a,ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return ans;
}
ll inv(ll x)
{
return pow_mod(x,mod-2);
}
int main()
{
ll t,p,q,k,i;
while(~scanf("%lld",&t))
{
while(t--)
{
scanf("%lld%lld%lld",&p,&q,&k);
ll ans,x,y;
x=(2*q*inv(p))%mod;
y=(1-x+mod)%mod;
ans=pow_mod(y,k)%mod;
ans=(ans+1)%mod;
ans=ans*inv(2)%mod;
printf("%lld\n",ans);
}
}
return 0;
}
---