牛牛和牛可乐的赌约
來源:牛客網:
牛牛和牛可樂的賭約
時間限制: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
輸入
復制
輸出
復制
題解:
結合逆元直接求解
代碼:
#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; }總結
- 上一篇: 李想再度“开团”
- 下一篇: 牛牛和牛可乐的赌约2