链接:https://www.nowcoder.com/acm/contest/129/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
有一个随机数生成器,每次运行以a/10000的概率产生1,1-a/10000的概率产生0,两次运行之间相互独立。
求运行n次后,产生1的个数为奇数的概率。为避免误差,答案对10 9+7取模(设答案化为的最简分数为
,则输出A· B
-1 mod (10
9+7),其中B
-1是B模10
9+7的乘法逆元)。
求运行n次后,产生1的个数为奇数的概率。为避免误差,答案对10 9+7取模(设答案化为的最简分数为
![](https://i-blog.csdnimg.cn/blog_migrate/6c7f985d8d082a87965e1056ea0d42b1.png)
输入描述:
第一行一个整数,表示a
第二行一个整数,表示n
输出描述:
一个整数,表示答案
备注:
![](https://i-blog.csdnimg.cn/blog_migrate/e51c4c2990644f2799f176f7891e7ebe.png)
0≤ a ≤ 10000
首先给出费马小定理::: 如果p是质数且gcd(p,a)==1>>则a^(p-1)%p==1>>>针对a^n取模的运算
其次::讲述取模的条件>>交换律与结合律>>这一部分我没有系统的学习过>>不好说>>只能积累经验
再其次>>讲述>>假设一枚硬币正面向上的概率是p,求抛n次>>奇数次向上的概率
![](https://i-blog.csdnimg.cn/blog_migrate/8292b2e0d4b5fcc5dc0ec6e4ce67b777.png)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll pow_(ll a,ll b){
ll res=1,tmp=a;
while(b){
if(b&1) (res*=tmp)%=mod;
(tmp*=tmp)%=mod;
b/=2;
}
return res;
}
int main(){
std::ios::sync_with_stdio(false);
string s;int a;cin>>a>>s;ll n=0;
for(int i=0;i<s.size();i++)
n=(n*10+s[i]-'0')%(mod-1);
ll p=a*pow_(10000,mod-2);
p=1-2*p;
p=(p%mod+mod)%mod;
ll ans=1-pow_(p,n);
ans=(ans%mod+mod)%mod;
ans*=(mod+1)/2;ans%=mod;
cout<<ans<<endl;
return 0;
}