来源:牛客网:

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