题目链接

构造数对

题目描述

给定一个正整数 ,请你构造一个由两个正整数 组成的数对,使其同时满足下列全部条件:

  1. 整除 (即

若存在多个满足要求的数对,你可以输出其中任意一个;若不存在,则输出 -1。

解题思路

这是一个构造性的问题。题目要求我们找到任意一个满足条件的数对即可,这通常暗示我们可以尝试寻找一个非常简单的、通用的构造方案,而不是去复杂地搜索。

让我们来尝试一个最简单的构造:令 。现在我们来验证这个数对 是否满足所有条件。

  1. 条件 1:

    • 。只要给定的 ,这个条件就成立。
  2. 条件 2: 整除

    • 整除 。这总是成立的。
  3. 条件 3:

    • 是正整数时,这个不等式在 时成立。
  4. 条件 4:

    • 这个不等式同样在 时成立。

结论: 综合以上分析,我们发现只要 ,数对 就同时满足了所有四个条件。

特殊情况: 我们需要单独考虑 的情况。 当 时,根据条件 1,唯一可能的数对是 。 我们来验证这个数对:

  • 条件 1: (满足)
  • 条件 2: 整除 (满足)
  • 条件 3: (不满足)
  • 条件 4: (不满足) 由于条件 3 和 4 不满足,所以当 时,不存在满足条件的数对。

最终策略

  • 如果输入的 ,则无解,输出 -1。
  • 如果输入的 大于 ,则数对 是一个有效的解,输出

这个策略非常简单,并且覆盖了所有情况。

代码

#include <iostream>

using namespace std;

int main() {
    long long x;
    cin >> x;
    if (x == 1) {
        cout << -1 << endl;
    } else {
        cout << x << " " << x << endl;
    }
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long x = sc.nextLong();
        if (x == 1) {
            System.out.println(-1);
        } else {
            System.out.println(x + " " + x);
        }
    }
}
x = int(input())
if x == 1:
    print(-1)
else:
    print(x, x)

算法及复杂度

  • 算法:数学构造
  • 时间复杂度:,只需要进行一次判断和输出。
  • 空间复杂度:,只需要常数级别的额外空间。