牛客小百月赛 28 -- 牛牛和牛可乐的赌约
链接:https://ac.nowcoder.com/acm/contest/7412/A
来源:牛客网
题目描述
牛可乐发明了一种n面骰子(点数分别从1-n,掷出每面的概率为1/n)去给牛牛玩,因为牛牛是个欧皇,所以他想测试一下牛牛的人品,他告诉牛牛,让牛牛投m次骰子,牛牛如果全部投出点数为n{}nn的面就算牛牛赢,牛牛很相信自己的人品,就和牛可乐赌一包辣条,说自己肯定可以全部投出点数为n点面,但是牛牛又有点害怕自己打赌输了,想让你提前帮他计算一下他输概率有多少?
输入描述:
有多组输入样例,第一行为样例组数t(t≤1×106)t(tleq 1×10^6)t(t≤1×106)
接下来t行每行有一个整数n和m,分别表示骰子的面数和牛牛的投掷次数
(n,m<=1×109)(n,m<=1×10^9)(n,m<=1×109)
输出描述:
输出t行,每行输出为分数p/q mod 1e9+7的形式
示例1
输入
1 2 1
输出
500000004
备注:
数据较大,建议使用较快的输入输出
这个刚开始,直接把我整蒙, 没看懂下面的p/q % mod ,后来才想起是分数取模,加上快速幂,唉,我还是太菜了
分数取模公式: 比如E/V 对MOD 取余就是 E*ksm(V,MOD-2)%MOD;
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define mod 1000000007 ll qpow(ll a , ll n ) { ll base = a , ans = 1; while(n){ if(n&1) ans = (ans * base) % mod ; base *= base ; base %= mod; n>>=1; } return ans; } int main() { int a ; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>a; while(a--){ ll n , m; cin>>n>>m; cout<<(qpow(n,m)-1) * qpow(qpow(n,m),mod-2) % mod <<endl; } return 0; }