题目
A牛牛和牛可乐的赌约
题目链接
题解
注意阅读题目是计算牛牛输的概率。
需要掌握的知识点
- 快速幂
- 费马小定理
- 分数取模
首先我们容易知道 牛牛 赢的概率是
1
n
m
\frac{1}{n^m}
nm1
那么牛牛输的概率就是
1
−
1
n
m
1-\frac{1}{n^m}
1−nm1
这输的值一看就十分难以取模,那么我们就思考特殊分数,即当分子为1的时候取模是不是会比较简单呢
于是就从
1
n
m
\frac{1}{n^m}
nm1 入手
先引入费马小定理
假设要求解
1
a
m
o
d
p
\frac{1}{a} mod p
a1modp ,引用
a
p
−
1
=
1
(
m
o
d
p
)
a^{p-1}=1 (mod p)
ap−1=1(modp)
推导过程 将
a
p
−
1
=
a
p
−
2
∗
a
a^{p-1}=a^{p-2}*a
ap−1=ap−2∗a 带入得
a
p
−
2
∗
a
=
1
m
o
d
p
a^{p-2}*a=1 mod p
ap−2∗a=1modp
可得
a
p
−
2
=
1
a
m
o
d
p
a^{p-2}=\frac{1}{a} mod p
ap−2=a1modp
很明显,此处的a不就正是我们的
n
m
n^m
nm
化简可得
n
m
∗
(
p
−
2
)
=
1
n
m
m
o
d
p
n^{m*(p-2)}=\frac{1}{n^m}modp
nm∗(p−2)=nm1modp
然而这不是输,这是赢的值
故
p
+
1
−
n
m
∗
(
p
−
2
)
=
1
−
1
n
m
p+1-n^{m*(p-2)}=1-\frac{1}{n^m}
p+1−nm∗(p−2)=1−nm1
因为整项是对p取模的,所以需要
p
+
1
−
p+1-
p+1−
代码
//https://blog.youkuaiyun.com/godleaf/article/details/79844074
//费马小定理对分数取模
ll qpow(ll a, ll b, ll mod){
ll ans = 1;
while (b){
if (b & 1){
ans = (ans * a) % mod;
}
a = a * a % mod;
b >>= 1;
}
return ans;
}
const int p = 1e9 + 7;
int main(){
int t; scanf("%d", &t);
while(t--){
ll n, m; scanf("%lld%lld",&n, &m);
ll t1 = qpow(n, p - 2, p);
ll t2 = qpow(t1, m, p);
t2 = (1 - t2 + p) % p;
printf("%lld\n", t2);
}
}