文章

【GESP】C++二级练习 luogu-B2086, 不定方程求解

GESP二级练习,多层循环练习,难度★✮☆☆☆。

luogu-B2086

题目要求

题目描述

给定正整数 $a$,$b$,$c$。求不定方程 $ax+by=c$ 关于未知数 $x$ 和 $y$ 的所有非负整数解组数。

输入格式

一行,包含三个正整数 $a$,$b$,$c$,两个整数之间用单个空格隔开。每个数均不大于 $1000$。

输出格式

一个整数,即不定方程的非负整数解组数。

样例输入 #1

1
2 3 18

样例输出 #1

1
4

题目分析

两种解题思路总结:

  1. 第一种解题思路是使用两层循环,分别遍历 $x$ 和 $y$ 的所有可能取值,然后判断是否满足方程条件,如果满足则计数器加1。这种解题思路的时间复杂度为 $O(n^2)$,其中 $n$ 为 $x$ 和 $y$ 的最大取值。

  2. 第二种解题思路是只使用一层循环,遍历 $x$ 的所有可能取值,然后判断是否满足方程条件,如果满足则计数器加1。这种解题思路的时间复杂度为 $O(n)$,其中 $n$ 为 $x$ 的最大取值。

示例代码

思路一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main() {
    int a, b, c; // 定义三个整数变量a, b, c
    cin >> a >> b >> c; // 从输入流中读取a, b, c的值
    int count = 0; // 初始化计数器为0
    for (int i = 0; i <= 1000; i++) { // 外层循环,遍历i从0到1000
        for (int j = 0; j <= 1000; j++) { // 内层循环,遍历j从0到1000
            if (a * i + b * j == c) { // 判断是否满足方程条件
                count++; // 如果满足,则计数器加1
            }
        }
    }
    cout << count; // 输出计数器的值,即解的个数
    return 0;
}

思路二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main() {
    int a, b, c; // 定义三个整数变量a, b, c
    cin >> a >> b >> c; // 从输入流中读取a, b, c的值
    int count = 0; // 初始化计数器为0
    for (int i = 0; i <= 1000; i++) { // 外层循环,遍历i从0到1000
        if ((c - a * i) >= 0 && (c - a * i) % b == 0) { // 判断是否满足方程条件
            count++; // 如果满足,则计数器加1
        }
    }
    cout << count; // 输出计数器的值,即解的个数
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY 4.0 进行授权