#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint N = 2e5 + 10; #define A puts("Walk Alone") #define K puts("Kelin") intmain(){ int n, m; cin >> n >> m; if(n == m && n == 1) A; else K; }
题J
题意:A 初始有 n 元,他每次 gamble 花费 x 元赌注,有 0.5 概率获胜,获胜则获得 2∗x 元, 反之无收获,问 A 赚取 m 元的概率是多少。其中 x 初始值为 1, 若上一轮获胜则 x=1, 反之 x=x∗2, 对于概率 a=x/y 满足 a∗y=xMOD998244353 (1<=n,m<=1e9)
#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint N = 2e5 + 10, MOD = 998244353; ll qmi(ll a, ll b){ ll ans = 1; while(b){ if(b & 1) ans = ans * a % MOD; a = a * a % MOD; b >>= 1; } return ans; } intmain(){ ll n, m, ans = 1, sum = 0, x = 0, mx; cin >> n >> m; for(ll x = n; x < m + n; x = mx){ ll lg = log2(x + 1); ll p = (1 - qmi(qmi(2, lg), MOD - 2) + MOD) % MOD; mx = min((1ll << (lg + 1)) - 1, m + n); ans = ans * qmi(p, mx - x) % MOD; } cout << ans; }