不定方程求解

GitHub跳转原题关系图返回列表

枚举 x 的非负上界 c//a,逐个判定 (c-ax) 能否被 b 整除,整除即唯一确定一组非负解,计数即为答案。

OJ: roj

题目 ID: 1101

难度:入门

标签:枚举数论

创建: 2026-09-29 18:51

更新: 2026-10-05 01:08

题目描述

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

输入:一行三个正整数 a,b,ca, b, c(每个 ⩽1000\leqslant 1000),空格分隔。

输出:一个整数,即非负整数解的组数。

样例输入:2 3 18  样例输出:4

思路

固定 xx 后 y=(c−ax)/by = (c - ax)/b 被唯一确定,故只需枚举 x∈[0,⌊c/a⌋]x \in [0, \lfloor c/a \rfloor],逐个判 (c−ax) mod b=0(c - ax) \bmod b = 0,成立即贡献一组解;总枚举量 ⩽1001\leqslant 1001,时间复杂度 O(c/a)O(c/a)。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 10:30
# update_at: 2026-10-02 10:30

import sys


def solve() -> None:
    a, b, c = map(int, sys.stdin.buffer.read().split())

    # x 上界是 c//a:再大则 a*x > c,y 无非负解;枚举每个 x,余数 (c-a*x) 整除 b 即有一解
    print(sum((c - a * x) % b == 0 for x in range(c // a + 1)))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 01:09
 * update_at: 2026-10-05 01:09
 */
// main.cpp:不定方程 ax+by=c 的非负整数解计数(roj 1101)。
// 做法:固定 x 在 [0, c/a] 范围枚举,每个 x 唯一决定 y=(c-a*x)/b,
// 当且仅当 (c-a*x) >= 0 且被 b 整除时贡献一组解。

#include <cstdio>
using namespace std;

typedef long long ll;

ll a, b, c;   // 方程系数 a, b, c
ll ans;       // 非负整数解计数

int main() {
    // 读入 a, b, c
    scanf("%lld %lld %lld", &a, &b, &c);

    // 枚举 x 从 0 到 c/a:超过此范围则 a*x > c,没有合法非负 y
    for (ll x = 0; x <= c / a; ++x) {
        ll rest = c - a * x;
        // 余数 (c - a*x) 必须能被 b 整除才给出整数 y,且 y = rest / b >= 0 自动成立
        if (rest % b == 0) {
            ++ans;
        }
    }

    printf("%lld\n", ans);
    return 0;
}