本文共 1145 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要计算牛牛投掷骰子时输的概率。牛牛投掷m次n面的骰子,每次投掷都必须出现n点,才能赢。输的概率是至少有一次投掷不是n点。我们可以通过快速幂和模逆元来高效地计算这个概率。
#includeusing namespace std;typedef long long ll;const int MOD = 1e9 + 7;ll poww(ll a, ll b, int mod) { ll ans = 1; ll base = a; while (b) { if (b & 1) ans = (ans * base) % mod; base = (base * base) % mod; b >>= 1; } return ans;}ll inv(ll a, int mod) { return poww(a, mod - 2, mod);}int main() { ll t; read(t); for (int _ = 0; _ < t; ++_) { ll n, m; n = read(); m = read(); if (n == 1) { cout << 0 << endl; continue; } ll inv_n = inv(n, MOD); ll inv_pow = poww(inv_n, m, MOD); ll res = (1 - inv_pow + MOD) % MOD; cout << res << endl; }}
poww
用于快速计算大数的幂取模,适用于处理大指数问题。inv
使用费马小定理计算模逆元,适用于质数模数。通过这种方法,我们可以高效地计算牛牛输的概率,并在大数情况下快速得到结果。
转载地址:http://ywzb.baihongyu.com/