trilogy probability
unknown
c_cpp
9 months ago
1.4 kB
3
Indexable
#include <bits/stdc++.h> using namespace std; #define ll long long int MOD = 1e9 + 7; ll mod_pow(ll a, ll b, ll mod) { ll res = 1; while (b > 0) { if (b & 1) { res = (res * a) % mod; } a = (a * a) % mod; b >>= 1; } return res; } vector<int> solve(const vector<vector<int>>& q) { int mx = 1e6; vector<ll> dp(mx + 1, 0); for (int i = 2; i <= mx; ++i) { int h = i >> 1; if (i & 1) { dp[i] = (1LL + 2LL * dp[h]) % MOD; } else { dp[i] = (1LL + dp[h - 1] + dp[h]) % MOD; } } vector<int> res; res.reserve(q.size()); for (const auto& r : q) { int l = r[0]; int n = r[1] - l + 1; if (n == 1) { res.push_back(1); } else { ll k = dp[n]; ll p = n - k; ll q_inv = mod_pow(n, MOD - 2, MOD); ll ans = (p * q_inv) % MOD; res.push_back((int)ans); } } return res; } int main() { int t; cin >> t; vector<vector<int>> intervals(t, vector<int>(2)); for (int i = 0; i < t; ++i) { cin >> intervals[i][0] >> intervals[i][1]; } vector<int> answers = solve(intervals); for (const int& ans : answers) { cout << ans << '\n'; } return 0; }
Editor is loading...
Leave a Comment