来源:牛客网:

牛牛和牛可乐的赌约
时间限制: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;
}