题意
t组测试,每行给n(代表n个点, 0 ,1,2 ....n-1),m。从0开始走,把n个点都走一遍结束。问在m点结束的概率是多少。输出前i个概率的积。
题解
除了0,在其他点结束的概率都是一样的。也就是(1/(n-1).
当n=1是,概率为1(因为只有一个点,0是起点也是终点)
否则,m=0时,概率为0(因为初始从0开始,所以走完一遍绝对不会停在0上)。
AC代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll pown(ll a, ll b){ // 求逆元
ll res = 1;
while(b){
if(b&1){
res = (res * a) % mod;
}
a = (a * a) % mod;
b >>= 1;
}
return res;
}
int main(){
int t;
ll n, m, ans, res;
ans = 1; // ans 在外面初始化,因为是求前i个结果的积
scanf("%d", &t);
while(t--){
cin >> n >> m;
if (n == 1){ // 只有1个点
printf("%lld\n", ans);
}
else {
if(m == 0){
ans = 0;
}
else{
ans = ans * pown(n-1,mod-2) % mod;
}
printf("%lld\n", ans); // ans 不能在此处运算,不然会错
}
}
return 0;
}