[Algo Beat Contest 001 F] Foolish Math Homework 官方题解
原作者是 fcy。
设
则问题转化为
同时除以
显然,
考虑数论分块,枚举区间
二维数论分块后求和即可,
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll calc(ll n, ll m) {
ll t = min(n, m);
ll l = 1, r, res = 0;
while (l <= t) {
r = min({n / (n / l), m / (m / l), t});
ll a1 = n / l, a2 = m / l;
res += min(a1, a2 - 1) * (r - l + 1);
l = r + 1;
}
return res;
}
int main() {
ll l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
cout << calc(l1 - 1, l2 - 1) + calc(r1, r2) - calc(l1 - 1, r2) - calc(r1, l2 - 1);
return 0;
}