链接:https://ac.nowcoder.com/acm/contest/11334/A
来源:牛客网
题目描述
牛可乐发明了一种n面骰子(点数分别从1{}1到{}nn,掷出每面的概率为\frac {1} {n}
n
1
)去给牛牛玩,因为牛牛是个欧皇,所以他想测试一下牛牛的人品,他告诉牛牛,让牛牛投m{}m次骰子,牛牛如果全部投出点数为{}nn的面就算牛牛赢,牛牛很相信自己的人品,就和牛可乐赌一包辣条,说自己肯定可以全部投出点数为{}nn点面,但是牛牛又有点害怕自己打赌输了,想让你提前帮他计算一下他输概率有多少?
输入描述:
有多组输入样例,第一行为样例组数t(t\leq 1×10^6)t(t≤1×10
6
)
接下来t行每行有一个整数n和m,分别表示骰子的面数和牛牛的投掷次数
(n,m<=1×10^9)(n,m<=1×10
9
)
输出描述:
输出t行,每行输出为分数p/q mod 1e9+7的形式
示例1
输入
复制
1
2 1
输出
复制
500000004
备注:
数据较大,建议使用较快的输入输出
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 1e9 + 7;
typedef long long LL;
LL qmi(int a, int b, int mod){
LL res = 1 % mod;
while(b){
if (b & 1) res = res % mod * (a % mod) % mod;
a = (LL)a % mod * a % mod;
b >>= 1;
}
return res % mod;
}
int main(){
int T;
scanf("%d", &T);
while(T --){
int n, m;
scanf("%d%d", &n, &m);
// cout << qmi(2, 5, mod) << endl;
LL P1 = qmi(n, m, mod) - 1;
LL temp = P1 + 1;
// cout << temp << endl;
LL P2 = qmi(temp, mod - 2, mod);
// cout << P2 << endl;
LL ans = (P1 * P2) % mod;
printf("%lld\n", ans);
}
return 0;
}