牛牛和牛可乐的赌约
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
牛可乐发明了一种n面骰子(点数分别从1{}1到{}nn,掷出每面的概率为(1/n)去给牛牛玩,因为牛牛是个欧皇,所以他想测试一下牛牛的人品,他告诉牛牛,让牛牛投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<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
ll poww(ll a,ll b,ll mod){
ll ans=1;
ll base=a;
while(b){
if(b&1)ans=ans*base%mod;
base=base*base%mod;
b>>=1;
}
return ans%mod;
}
ll inv(ll a,ll mod){
return poww(a,mod-2,mod);
}
int main()
{
ll t;
t=read();
while(t--)
{
ll n,m;
n=read();
m=read();
ll sum=poww(n,m,mod);
ll ans=((sum-1)*inv(sum,mod))%mod;
cout<<ans%mod<<endl;
// cout<<(n-1)*inv(n,mod)*m<<endl;
}
return 0;
}