正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2023 第一轮真题 › 第 31 题

CSP-J 2023 第一轮 第 31 题:程序(三):两个输出值的差值范围

阅读程序 · 初等数论 · 难度 较难 · 答案 D

题目

#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$ 的整数,完成下面的判断题和单选题。
CSP-J 2023 第一轮 第 31 题 原题
原题扫描(页面加载后可直接在线作答)

本小题

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

选项

  • A. 大于 $0$
  • B. 大于等于 $0$ 且不一定大于 $0$
  • C. 小于 $0$
  • D. 小于等于 $0$ 且不一定小于 $0$

答案

D

题解

选 D:小于等于 \(0\),且不一定小于 \(0\)(按题目意图,不考虑整数溢出)。

solve1(n) 返回 \(n^2\)。solve2(n) 枚举成对的因数,并避免重复计算平方根,因此返回 \(n\) 的所有正因数的平方和。记为 \[ S(n)=\sum_{d\mid n}d^2. \] 那么两个输出分别是 \(S(n^2)\) 和 \(S(n)^2\)。

关键是比较: \[ S(n)^2 =\left(\sum_{a\mid n}a^2\right)\left(\sum_{b\mid n}b^2\right) =\sum_{a\mid n,\ b\mid n}(ab)^2. \]

这里有两个性质:

  • \(a,b\) 都是 \(n\) 的因数,所以 \(ab\) 是 \(n^2\) 的因数。
  • \(n^2\) 的每个因数,都能写成两个 \(n\) 的因数的乘积。因为若某个质因子在 \(n\) 中的指数为 \(k\),它在 \(n^2\) 的因数中的指数至多为 \(2k\),总能拆成两个不超过 \(k\) 的指数。

因此,右边包含了 \(S(n^2)\) 的所有项,而且可能重复计算,故 \[ S(n)^2\ge S(n^2), \qquad \boxed{S(n^2)-S(n)^2\le0}. \]

再看是否能取等号:

  • \(n=1\):两个输出都是 \(1\),差为 \(0\)。
  • \(n>1\):\((a,b)=(1,n)\) 和 \((n,1)\) 会重复贡献 \(n^2\),所以差严格小于 \(0\)。

所以选 D。

补充:原代码使用 int,在题目给出的范围内确实可能溢出;例如 \(n=1000\) 时会计算 \(10^{12}\)。实际实现应使用 long long。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号