diff --git a/AcWing/2702/2702.cpp b/AcWing/2702/2702.cpp new file mode 100644 index 00000000..96c32804 --- /dev/null +++ b/AcWing/2702/2702.cpp @@ -0,0 +1,50 @@ +#include + +using namespace std; + +int n, a, b, c, d, k, p; +int mu[50005], primes[50005], sum[50005]; +bool vis[50005]; + +void getMobius(int n) { + mu[1] = 1; + for (int i = 2; i <= n; i++) { + if (!vis[i]) { + primes[++p] = i; + mu[i] = -1; + } + for (int j = 1; i * primes[j] <= n; j++) { + vis[i * primes[j]] = true; + if (i % primes[j] == 0) break; + mu[i * primes[j]] = -mu[i]; + } + } +} + +int g(int k, int x) { + return k / (k / x); +} + +long long f(int a, int b, int k) { + a = a / k, b = b / k; + long long res = 0; + int n = min(a, b); + for (int l = 1, r; l <= n; l = r + 1) { + r = min(n, min(g(a, l), g(b, l))); + res += (long long)(sum[r] - sum[l - 1]) * (a / l) * (b / l); + } + return res; +} + +int main() { + cin >> n; + getMobius(50000); + for (int i = 1; i <= 50000; i++) { + sum[i] = sum[i - 1] + mu[i]; + } + while (n--) { + cin >> a >> b >> c >> d >> k; + cout << f(b, d, k) - f(a - 1, d, k) - f(b, c - 1, k) + f(a - 1, c - 1, k) << endl; + } + return 0; +}