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