思路有a,b两个数, 给出它们的范围 计数 (floor(a/b) == a % b) 的所有有序对个数。
- 对等式变形为 a = k ∗ b + k ( b > k ) a = k * b + k (b > k) a=k∗b+k(b>k),现在只需考虑等式右边,因为是k是b的模数,所以一定小于b
- 显然k最大不可以超过sqrt(x)的,那么就可以枚举k,在b的取值范围内二分符合条件的区间即可。
#include#define yes puts("yes"); #define inf 0x3f3f3f3f #define ll long long #define linf 0x3f3f3f3f3f3f3f3f #define debug(x) cout<<"> "<< x< PII; const int N =10 + 1e5 ,mod=1e9 + 7; void solve() { int x,y; cin >> x >> y; int mx = floor(sqrt(x)); ll res = 0; for(int i = 1;i <= mx;i ++){ int l = i, r = y+1; while(l+1 < r){ int mid = l + r >> 1; if(1ll * i * mid + i > x) r = mid; else l = mid; } res += l - i; } cout << res << endl; } signed main() { ios::sync_with_stdio();cin.tie();cout.tie(); int T;cin>>T; while(T--) solve(); return 0; }



