牛牛和牛可乐的赌约

链接:https://ac.nowcoder.com/acm/contest/11334/A
来源:牛客网

题目描述
牛可乐发明了一种n面骰子(点数分别从1{}1到{}nn,掷出每面的概率为\frac {1} {n}
n
1

)去给牛牛玩,因为牛牛是个欧皇,所以他想测试一下牛牛的人品,他告诉牛牛,让牛牛投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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int mod = 1e9 + 7;

typedef long long LL;

LL qmi(int a, int b, int mod){
    
    
	LL res  = 1 % mod;
	while(b){
    
    
		if (b & 1)   res = res % mod * (a % mod) % mod;
		a = (LL)a % mod * a % mod;
		b >>= 1;
	}
	return res % mod;
}

int main(){
    
    
	int T;
	scanf("%d", &T);
	
	while(T --){
    
    
		int n, m;
		scanf("%d%d", &n, &m);
	//	cout << qmi(2, 5, mod) << endl;
		LL P1 = qmi(n, m, mod) - 1;
		LL temp = P1 + 1;
	//	cout << temp << endl;
		LL P2 = qmi(temp, mod - 2, mod);
	//	cout << P2 << endl;
		LL ans = (P1 * P2) % mod;
		
		printf("%lld\n", ans);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45772483/article/details/112554538
今日推荐