From 2ccc942a7f390bfe3be9d6cd620aa420d624e0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Sat, 16 Dec 2023 12:55:15 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/Mobius/SQP4168.cpp | 62 ++++++++++++++++++++++++++++++++ TangDou/Topic/Mobius/SQP4168.in | 4 +++ 2 files changed, 66 insertions(+) create mode 100644 TangDou/Topic/Mobius/SQP4168.cpp create mode 100644 TangDou/Topic/Mobius/SQP4168.in diff --git a/TangDou/Topic/Mobius/SQP4168.cpp b/TangDou/Topic/Mobius/SQP4168.cpp new file mode 100644 index 0000000..720daa5 --- /dev/null +++ b/TangDou/Topic/Mobius/SQP4168.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +using namespace std; +#define int long long +#define endl "\n" + +const int N = 1e7 + 10; // 枚举到sqrt(1e14)=1e7即可 + +// 筛法求莫比乌斯函数(枚举约数) +int mu[N], s1[N], s2[N]; // s1[N]:梅滕斯函数,也就是莫比乌斯函数的前缀和 +int primes[N], cnt; +bool st[N]; +void get_mobius(int n) { + mu[1] = 1; + for (int i = 2; i <= n; i++) { + if (!st[i]) { + primes[cnt++] = i; + mu[i] = -1; + } + for (int j = 0; primes[j] <= n / i; j++) { + int t = primes[j] * i; + st[t] = true; + if (i % primes[j] == 0) { + mu[t] = 0; + break; + } + mu[t] = -mu[i]; + } + } + // 维护u(x)前缀和:梅滕斯函数 + for (int i = 1; i <= n; i++) s1[i] = s1[i - 1] + mu[i]; + for (int i = 1; i <= n; i++) s2[i] = s2[i - 1] + mu[i] * mu[i]; +} + +int calc(int n) { + if (n <= N) return s2[n]; + int res = 0, m = sqrt(n); + for (int l = 1, r; l <= m; l = r + 1) { + r = min((int)sqrt(n / (n / (l * l))), m); + res += (n / (l * l)) * (s1[r] - s1[l - 1]); + } + return res; +} + +signed main() { +#ifndef ONLINE_JUDGE + freopen("SQP4168.in", "r", stdin); + /* + 1 + 608 + 60792710185947 + */ +#endif + int n, T; + cin >> T; + get_mobius(N - 1); + while (T--) { + cin >> n; + cout << calc(n) << endl; + } +} diff --git a/TangDou/Topic/Mobius/SQP4168.in b/TangDou/Topic/Mobius/SQP4168.in new file mode 100644 index 0000000..6f696ea --- /dev/null +++ b/TangDou/Topic/Mobius/SQP4168.in @@ -0,0 +1,4 @@ +3 +1 +1000 +100000000000000 \ No newline at end of file