留个赞拿走
2025-07-01 18:59:52
发布于:上海
14阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n;
vector<int> a(n);
for (int &x : a) cin >> x;
cin >> m;
vector<int> b(m);
for (int &x : b) cin >> x;
const int A = *max_element(a.begin(), a.end());
const int B = *max_element(b.begin(), b.end());
const int C = max(A, B);
vector<bool> isprime(C+1, true);
vector<int> prime, mu(C+1);
isprime[0] = isprime[1] = false;
mu[1] = 1;
for (int i = 2; i <= C; ++i) {
if (isprime[i]) {
prime.push_back(i);
mu[i] = -1;
}
for (int p : prime) {
if (i*p > C) break;
isprime[i*p] = false;
mu[i*p] = (i%p) ? -mu[i] : 0;
if (i%p == 0) break;
}
}
vector<int64_t> f(C+1), g(C+1), h(C+1);
for (int i = 1; i <= C; ++i) f[i] = i * mu[i];
for (int p : prime)
for (int i = 1; p*i <= C; ++i)
f[p*i] += f[i];
for (int x : a) g[x] += x;
for (int p : prime)
for (int i = C/p; i >= 1; --i)
g[i] += g[p*i];
for (int i = 1; i <= C; ++i)
h[i] = g[i] / i * f[i];
for (int p : prime)
for (int i = 1; p*i <= C; ++i)
h[p*i] += h[i];
for (int x : b) cout << h[x] << '\n';
}
全部评论 1
这是我根据别人思路写的,不是完全自创
2025-07-01 来自 上海
1
有帮助,赞一个