#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 时,输出为( )
这题核心是读懂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来测试边界。暂无足够依据预测具体年份,但这类题型未来仍会高频出现。