2023年CSP-S1阅读程序题2:
01 #include <iostream> 02 #include <cmath> 03 #include <vector> 04 #include <algorithm> 05 using namespace std; 06 07 long long solve1(int n){ 08 vector<bool> p(n+1, true); 09 vector<long long> f(n+1,0),g(n+1,0); 10 f[1]= 1; 11 for (int i = 2; i*i <= n; i++){ 12 if (p[i]){ 13 vector<int> d; 14 for(int k = i;k <=n; k *= i)d.push_back(k); 15 reverse(d.begin(),d.end()); 16 for (int k:d){for (int j =k; j<=n;j += k){ 18 if (p[j]){ 19 p[j]= false; 20 f[j]= i; 21 g[j]= k; 22 } 23 } 24 } 25 } 26 } 27 for (int i = sqrt(n)+ 1; i <= n; i++){ 28 if (p[i]){ 29 f[i]= i; 30 g[i]= i; 31 } 32 } 33 long long sum = 1; 34 for(int i = 2; i <= n; i++){ 35 f[i]= f[i / g[i]]*(g[i]* f[i]- 1)/(f[i]- 1); 36 sum += f[i]; 37 } 38 return sum; 39} 40 41 long long solve2(int n){ 42 long long sum = 0; 43 for(int i= 1; i <= n; i++){ 44 sum += i*(n / i); 45 } 46 return sum; 47} 48 49 int main(){ 50 int n; 51 cin >> n; 52 cout << solve1(n)<< endl; 53 cout << solve2(n)<< endl; 54 return 0; 55}
假设输入的n是不超过1000000的自然数,完成下面的判断题和单选题:
将第15行删去,输出不变。 ( )
当输入为“10”时,输出的第一行大于第二行。 ( )
当输入为“1000”时,输出的第一行与第二行相等。 ( )
solve1(n)的时间复杂度为( )
O(n log² n)
(O(n))
(O(n log n))
(O(nlog log n)
solve(2)的时间复杂度为( )
O(n²)
O(n)
O(n log n)
O()
输入为"5"时,输出的第二行为( )
“20”
“21”
“22”
“23”