Roulette

 

 

 

 

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#define scanf scanf_s
using namespace std;
#define int long long
const int mod = 998244353;
 
int fpow(int x, int b)
{
    if (x == 0) return 0;
    if (b == 0) return 1;
    int res = 1;
    while (b > 0)
    {
        if (b & 1)  res = 1LL * res * x % mod;
        x = 1LL * x * x % mod;
        b >>= 1;
    }
    return res;
}
int calc(int x)
{
    int res = 0;
    for (int i = 1;; i *= 2)
    {
        if (x < i) break;
        res++, x -= i;
    }
    return res;
}
 
signed main()
{
    int n, m;
    cin >> n >> m;
    int ans = 1;
    int l = n, r = n + m - 1;
    while (l <= r)
    {
        int L = l, R = r, res = L;
        while (L <= R)
        {
            int mid = (L + R) >> 1;
            if (calc(mid) == calc(l)) res = mid, L = mid + 1;
            else R = mid - 1;
        }
        int prob = (1 - fpow(499122177, calc(l)) + mod) % mod;
        ans = ans * fpow(prob, res - l + 1) % mod;
        l = res + 1;
    }
    cout << ans << "\n";
    return 0;
}

 

posted @ 2023-07-18 21:10  write_FW  阅读(2)  评论(0)    收藏  举报