显然不可暴力解出,因此是到数学题。已知$$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;
}
标签:Insane,r1,993,int,r2,l2,补题,l1,cur
From: https://www.cnblogs.com/acing/p/18611301