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

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

2017-09-18 21:16 288 查看
题意:抛k次硬币,硬币正面朝上的概率是q/p,问出现偶数次正面朝上的概率是多少,答案取模1e9+7

思路:经过数学推导最后得到 (p^k+(p-2*q)^k)/(2*p^k) 之后取模1e9+7,用到了快速幂和逆元
#include <iostream>
#include <cstddef>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#define S second
#define F frist
using namespace std;
typedef long long ll;
const ll mod=1000000007;

ll pow_mod(ll a,ll b)   // 快速幂取模
{
ll ans=1;
while (b)
{
if (b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
ll ext_gcd(ll a, ll b, ll &x, ll &y)    //扩展欧几里得
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
ll d = ext_gcd(b, a % b, x, y);
ll tmp = x;
x = y;
y = tmp-a/b*y;
return d;
}
ll inv(ll a, ll mod)  {              // 逆元计算
ll x, y;
ext_gcd(a, mod, x, y);
return (x % mod + mod) % mod;

}
int main()
{
ll p,q,k;
int t;
cin >> t;
while(t--)
{
cin >> p >> q >> k;
q=pow_mod(p-2*q,k);
p=pow_mod(p,k);
q=(p+q)%mod;
p=(p*2)%mod;
cout << (inv(p,mod)*q)%mod << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论