题目链接

复杂的最大公约数

题目描述

给定两个正整数 ,求区间 中所有整数的最大公约数。即求 。输入中的 可能会非常大,超出 64 位整数的范围。

解题思路

本题要求一个连续整数区间的最大公约数。我们可以通过分析最大公约数的性质来简化问题。

。根据最大公约数的定义, 必须能够整除区间内的每一个数。

我们分两种情况讨论:

  1. 时: 区间内只有一个整数 。根据定义,一个数的最大公约数就是它本身。所以,当 时,答案就是

  2. 时: 此时,区间 至少包含两个连续的整数:。 因为 是整个区间的最大公约数,所以 必须能同时整除 。 根据最大公约数的一条重要性质:如果一个数能同时整除两个整数,那么它也一定能整除这两个整数的差。 因此, 必须能整除 。 唯一能整除 1 的正整数只有 1 本身。所以,在这种情况下, 必定为 1。

综上所述,我们只需要判断 是否相等即可。

关于大数处理: 题目提到输入的数值可能非常大。

  • Python 中,整数类型支持任意精度,可以直接处理。
  • Java 中,需要使用 java.math.BigInteger 类来处理。
  • C++ 中,没有内置的大数类型,但由于我们只需要比较两个数是否相等,所以可以将它们作为字符串读入并进行比较,从而避免实现复杂的大数运算。

代码

#include <iostream>
#include <string>

using namespace std;

int main() {
    string a, b;
    cin >> a >> b;

    if (a == b) {
        cout << a << "\n";
    } else {
        cout << 1 << "\n";
    }
    
    return 0;
}
import java.util.Scanner;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        BigInteger a = sc.nextBigInteger();
        BigInteger b = sc.nextBigInteger();

        if (a.equals(b)) {
            System.out.println(a);
        } else {
            System.out.println(1);
        }
    }
}
a, b = map(int, input().split())

if a == b:
    print(a)
else:
    print(1)

算法及复杂度

  • 算法:数学推理与分类讨论
  • 时间复杂度:。主要开销在于读取和比较两个可能很长的数字字符串,其时间复杂度与数字的位数成正比。
  • 空间复杂度:。需要空间来存储输入的两个大数。