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