不是VIP会员,不能显示答案

题目解答

题目:
#include <iostream>

#include <cmath>

#include <vector>

#include <algorithm>

using namespace std;



long long solve1(int n) {

vector<bool> p(n+1, true);

vector<long long> f(n+1,0),g(n+1,0);

f[1] = 1;

for (int i= 2; i*i<= n; i++) {

if (p[i]) {

vector<int> d;

for (int k=i; k <= n; k *= i) d.push_back(k);

reverse(d.begin(),d.end());

for (int k : d) {

for (int j= k; j<= n; j+= k) {

if (p[j]) {

p[j] = false;

f[j] = i;

g[j] = k;

}

}

}

}

}

for (int i= sqrt(n) + 1; i<= n; i++) {

if (p[i]) {

f[i] = i;

g[i] = i;

}

}

long long sum = 1;

for (int i=2; i<= n; i++) {

f[i]=f[i / g[i]]*(g[i]*f[i]-1) / (f[i]-1);

sum += f[i];

}

return sum;

}



long long solve2(int n) {

long long sum = 0;

for (int i= 1; i <= n; i++) {

sum +=i*(n /i);

}

return sum;

}



int main() {

int n;

cin >>n;

cout << solve1(n)<< endl;

cout << solve2(n)<< endl;

return 0;

}




判断题

1) 将第15 行删去,输出不变( )

2) 当输入为“10”时,输出的第一行大于第二行。( )

3) 当输入为“1000”时,输出的第一行与第二行相等( )




选择题

4) solve1(n)的时间复杂度为( )

5) solve2(n)的时间复杂度为( )

6) 输入为“5”时,输出的第二行为( )
考点: 0
分析:
解答: 本题算法类似筛法,其作用不用理解清楚,并不影响做题,15行删掉以后倒序排列的数组变正序了,导致第二行输出内容改变。若不对代码进行修改,第一行和第二行一模一样。故2错,3题对,4 5根据算法可以分析时间复杂度,6题自己计算
评论:
老师: 0