(补题)Codeforces Round 993 (Div. 4) E.Insane Problem

显然不可暴力解出,因此是到数学题。已知$$y=x * k^n$$所以我们可以利用y的区间范围$$[l1, r1]$$得出x的新的区间范围$$[l2/k^n(向上取整), r2/k^n(向下取整)]$$接着与原来的范围取交集
然后不断枚举n即可,注意k^n不可能超过y

#include <iostream>
#define int long long

using namespace std;

void solve()
{
    int k, l1, r1, l2, r2;
    cin >> k >> l1 >> r1 >> l2 >> r2;
    int cur = 1, ans = 0;
    while (cur <= r2)
    {
        //由公式得 x 新的左右范围,取交集
        int L = max(l1, (l2 + cur - 1) / cur);
        int R = min(r1, r2 / cur);
        if (R >= L) ans += R - L + 1;
        cur *= k;
    }
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    int t;
    cin >> t;
    while (t --) solve();

    return 0;
}
posted @ 2024-12-16 23:15  windfallll  阅读(82)  评论(0)    收藏  举报