CSP-J 入门级 · CSP 2023 入门级第一轮 第 18 题

阅读程序 · 答案 ABDC · 考点:数论基础、整数与整除、循环结构

← 整套速查表 CSP-J 入门级 全部真题

题目

3.

#include <iostream>
#include <cmath>
using namespace std;

int solve1(int n){
    return n*n;
}

int solve2(int n){
   int sum=0;
   for(int i=1;i<=sqrt(n);i++){
        if(n%i==0){
            if(n/i==i){
                sum+=i*i;
            }else{
                sum+=i*i+(n/i)*(n/i);
            }
        }
    }
    return sum;
}
int main(){
    int n;
    cin>>n;
    cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
    return 0;
}

假设输入的 $n$ 是绝对值不超过 $1000$ 的整数,完成下面的判断题和单选题。

判断题

1. 如果输入的 $n$ 为正整数,solve2 函数的作用是计算 $n$ 所有的因子的平方和( )

2. 第 $13\sim 14$ 行的作用是避免 $n$ 的平方根因子 $i$(或 $n/i$ )进入第 $16$ 行而被计算两次( )

3. 如果输入的 $n$ 为质数,solve2(n) 的返回值为 $n^2+1$( )

单选题

4. (4分)如果输入的 $n$ 为质数 $p$ 的平方,那么 solve2(n) 的返回值为( )

5. 当输入为正整数时,第一项减去第二项的差值一定( )

6. 当输入为 5 时,输出为( )

答案:ABDC

考点

数论基础整数与整除循环结构

解题思维

这题核心是读懂solve2的因子遍历逻辑,特别是sqrt(n)处去重,以及把n²与solve2(n)的平方这两个量级完全不同的数对比。

常见错误

学生容易把solve2(n²)当成‘n²的因子和’,或者误以为solve2(n)增长极快导致差值为正,忽略了n²的因子数量级远多于n,且平方和公式是多项式级增长,差值往往非正。

详细解析(节选)

这道题考查循环结构中的因子遍历、平方根处去重逻辑,以及数论中因子的平方和性质。命题人喜欢挖坑在:1) 循环边界i<=sqrt(n)时,若n是平方数,中间那个因子会被重复算,所以必须特判n/i==i的情况;2) 把solve2(solve1(n))和solve1(solve2(n))混为一谈,前者是n²所有因子的平方和,后者是‘n的因子平方和’再平方,两者量级天差地别。拿到题先想:solve2(n)到底算啥?就是n所有因子的平方和。然后看main里两个输出:第一个是solve2(n²),第二个是(solve2(n))²。接下来逐问推演。判断题1:solve2对正整数n确实计算所有因子的平方和,正确。判断题2:13-14行判断n/i==i,若成立只加一次i²,否则加i²+(n/i)²,这正是避免平方根因子被算两次的特判,正确。判断题3:质数n只有因子1和n,平方和就是1²+n²=n²+1,正确。单选题4:n=p²,因子有1、p、p²,平方和=1²+p²+(p²)²=1+n+n²,选B。单选题5:第一项solve2(n²)减去第二项(solve2(n))²。n=1时差为0;n=2时,solve2(2)=5,solve2(4)=21,21-25=-4<0;n=5时,solve2(5)=26,solve2(25)=651,651-26²=651-676=-25<0。可见差值非正,但不恒小于0,选D。单选题6:输入5,s1(5)=25,solve2(25)=1+25+625=651;solve2(5)=26,s1(26)=676,输出651 676,选C。考频趋势上,循环结构近年在CSP入门级考得极频,2023年77题、2024年128题、2025年158题,这类‘读程序+数论小陷阱’的组合题大概率还会出现在入门级或GESP四级、五级,命题人可能会换成正负数混合输入或更大范围n来测试边界。暂无足够依据预测具体年份,但这类题型未来仍会高频出现。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断