#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
ll qpow(ll a, ll p)
{
ll res = 1;
while (p)
{
if (p & 1)
res = res * a % mod;
a = a * a % mod;
p >>= 1;
}
return res;
}
int main()
{
ll n, m, i, j, res = 1, cnt;
cin >> n >> m;
for (i = 1; i <= m;)//把输输……输赢为一轮,每一轮赢一元,总共要进行m轮
{
ll k = __lg(n + i);//在有n + i元的情况下,最多连输的次数
ll p = (1LL - qpow((1LL << k) % mod, mod - 2) + mod) % mod;//1 - 1 / (2 ^ k)为一轮可以赢一块的概率
ll cnt = min((1LL << (k + 1)) - 1, n + m) - (n + i) + 1;//cnt为k值相同的轮数,一起算,不然TLE
res = res * qpow(p, cnt) % mod;
i += cnt;//跳着算
}
cout << res;
return 0;
}
倍投法则,求赢m块概率
最新推荐文章于 2024-06-13 23:07:13 发布