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

题目解答

题目:
# include <cmath>

# include <cstring>

# include <iostream>



const int MAXN =1000000;

int n;

int f1[MAXN], f2[MAXN],f3[MAXN];



int calc_f1(int x) {

int ans=1;

int maxNum = sqrt(x);

for (int i= 2; i<= maxNum; ++i)

if(x%i==0) {

ans=-ans;

x/=i;

if (x%i== 0)

return 0;

}

if(x!=1)

ans =-ans;

return ans;

}



int calc_f2(int x) {

return x;

}



void convolute( ) {

memset(f3, 0, sizeof(f3));

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

for (int j= 1; j<= n/i; ++j)

if(i*j<=n)

f3[i*j]= f3[i* i]+ f1[i]*f2[j];

}

int main() {

scanf("%d", &n);

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

f1[i] = calc_f1(i);

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

f2[i] - calc_f2(i);

convolute();

printf("% d\backslashn", f3[n]);

return 0;

}


判断题

1) 若将程序第31行的 n/i 改为n后运行,且已知程序可以安全地运行至第36行而不发生任何未定义行为,则程序依旧可以正常输出正确的答案。( )

2) 去掉程序第3行,程序依然可以正常编译。()




选择题

3) 该程序中,第30~33行运行的时间复杂度为( )。

4) 若输入3,程序的输出为( )。

5) 若输入1003,程序的输出为( )。

6) 若输入1000000,程序输出为( )。




注:本题中你只需要考虑数组越界这一种未定义行为。
考点:
分析:
解答:
评论:
老师: