上面题目用c++写一下
时间: 2024-04-12 14:29:43 浏览: 79
以下是用C++实现上述思路的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
const int mod = 1000000007;
// 线性筛法计算欧拉函数的前缀和
void calculatePhi(vector<int>& phi, vector<int>& prime, vector<bool>& isPrime, int k) {
phi[1] = 1;
for (int i = 2; i <= k; i++) {
if (isPrime[i]) {
prime.push_back(i);
phi[i] = i - 1;
}
for (int j = 0; j < prime.size() && i * prime[j] <= k; j++) {
isPrime[i * prime[j]] = false;
if (i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else {
phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
}
// 计算前缀和
for (int i = 2; i <= k; i++) {
phi[i] = (phi[i] + phi[i - 1]) % mod;
}
}
// 计算⌊n/i⌋的前缀和
vector<int> calculateDivPrefixSum(int n, int k) {
vector<int> sumDiv(k + 1, 0);
for (int i = 1; i <= k; i++) {
sumDiv[i] = (sumDiv[i - 1] + n / i) % mod;
}
return sumDiv;
}
int main() {
int k;
cin >> k;
vector<int> phi(k + 1, 0);
vector<int> prime;
vector<bool> isPrime(k + 1, true);
calculatePhi(phi, prime, isPrime, k);
vector<int> sumDiv = calculateDivPrefixSum(k, k);
int result = 0;
for (int i = 1; i <= k; i++) {
int factorCount = k / i;
int temp = (sumDiv[factorCount] - sumDiv[i - 1] + mod) % mod;
result = (result + phi[i] * temp) % mod;
}
cout << result << endl;
return 0;
}
```
你可以将上述代码保存为一个.cpp文件,然后使用C++编译器进行编译和运行。输入k的值,即可得到最终结果。
希望对你有帮助!如果还有其他问题,请随时提问。
阅读全文