1905E - One-X - CodeForces Solution


bitmasks combinatorics math trees

Please click on ads to support us..

C++ Code:

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse4,popcnt,abm,mmx,tune=native")
 
#include <bits/stdc++.h>
 
using namespace std;
 
#define pb push_back
#define eb emplace_back
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
 
using ll = long long;
using ld = long double;
using ii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vb = vector<bool>;
 
const int N = 1e5 + 5;
const int K = 21;

const ll mod = 998244353;

map<ll, ll> p2;

ll pw(ll x, ll y) {
    if (p2.count(y) > 0) {
        return p2[y];
    }
    if (y == 0) {
        return 1;
    }
    ll k = pw(x, y / 2);
    if (y & 1) {
        return p2[y] = k * k % mod * x % mod;
    } 
    return p2[y] = k * k % mod;
}
 
ll cnt_ways(ll n) {
    if (n == 1) {
        return 1;
    }
    ll l, r;
    l = (n + 1) / 2;
    r = n / 2;
    return (pw(2, l) - 1) * (pw(2, r) - 1) % mod;
}

ll calc(vector<array<ll, 3>> vec) {
    if (vec.empty()) {
        return 0;
    }
    ll ans = 0;
    vector<array<ll, 3>> tmp, new_vec;
    for (auto x: vec) {
        ans = (ans + cnt_ways(x[0]) * x[1] % mod) % mod;
        if (x[0] == 1) {
            continue;
        }
        if (x[0] % 2) {
            tmp.pb({(x[0] + 1) / 2, x[1] * 2 % mod, x[2]});
            tmp.pb({x[0] / 2, (x[1] * 2 + x[2]) % mod, x[2]});
        } else {
            tmp.pb({x[0] / 2, (x[1] * 4 + x[2]) % mod, x[2] * 2 % mod});
        }
    }
    for (auto x: tmp) {
        bool ok = false;
        for (auto &y: new_vec) {
            if (x[0] == y[0]) {
                y[1] = (y[1] + x[1]) % mod;
                y[2] = (y[2] + x[2]) % mod;
                ok = true;
                break;
            }
        }
        if (!ok) {
            new_vec.pb(x);
        }
    }
    return (ans + calc(new_vec)) % mod;
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int te;
    cin >> te;
    while (te--) {
        ll n;
        cin >> n;
        ll ans = calc({{n, 1, 1}});
        cout << ans << '\n';
    }
    return 0;
}


Comments

Submit
0 Comments
More Questions

253A - Boys and Girls
1327E - Count The Blocks
984A - Game
12B - Correct Solution
1355B - Young Explorers
485A - Factory
628A - Tennis Tournament
1436B - Prime Square
1707B - Difference Array
1422C - Bargain
1611F - ATM and Students
660A - Co-prime Array
1692F - 3SUM
1470A - Strange Birthday Party
190D - Non-Secret Cypher
1721B - Deadly Laser
1721C - Min-Max Array Transformation
1721A - Image
1180C - Valeriy and Deque
557A - Ilya and Diplomas
1037D - Valid BFS
1144F - Graph Without Long Directed Paths
1228A - Distinct Digits
355B - Vasya and Public Transport
1230A - Dawid and Bags of Candies
1530A - Binary Decimal
1472D - Even-Odd Game
441C - Valera and Tubes
1328E - Tree Queries
265A - Colorful Stones (Simplified Edition)