uva 10548 – Find the Right Changes(拓展欧几里得)

uva 10548 – Find the Right Changes(拓展欧几里得)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

题目链接:uva 10548 – Find the Right Changes

题目大意:给定A,B,C,求x,y,使得xA+yB=C,求有多少种解。

解题思路:拓展欧几里得,保证x,y均大于等于0,确定通解中t的取值。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f3f;

ll A, B, C;

void gcd (ll a, ll b, ll& d, ll& x, ll& y) {
    if (b == 0) {
        d = a;
        x = 1;
        y = 0;
    } else {
        gcd(b, a%b, d, y, x);
        y -= (a/b) * x;
    }
}

void solve () {
    ll d, x, y;
    gcd(A, B, d, x, y);

    if (C % d) {
        printf("Impossible\n");
        return;
    }

    ll up = INF, lower = -INF;

    if (B / d > 0)
        lower = max(lower, (ll)ceil( (-1.0*x*C) / B) );
    else
        up = min(up, (ll)floor( (-1.0*x*C) / B) );

    if (A / d > 0)
        up = min(up, (ll)floor( (1.0*y*C) / A));
    else
        lower = max(lower, (ll)ceil( (1.0*y*C) / A));

    if (up == INF || lower == -INF)
        printf("Infinitely many solutions\n");
    else if (up < lower)
        printf("Impossible\n");
    else
        printf("%lld\n", up - lower + 1);
}

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%lld%lld%lld", &A, &B, &C);
        solve();
    }
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118523.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号