Codeforces Round 592 (Div. 2) C题 The Football Season(Exgcd)

题目链接

https://codeforces.com/problemset/problem/1244/C

思路

其实就是要求 a x + b y = c ax+by=c ax+by=c的一组 x + y x+y x+y的最小整数解。因为题目保证了 a > b a>b a>b,所以只需要使得 y y y最小即可。

我们对 a x + b y = c ax+by=c ax+by=c推导得到: y = − a b x + c b y = -\frac{a}{b}x + \frac{c}{b} y=bax+bc,如下图所示:

在这里插入图片描述
该图展示了为什么 y y y要取最小非负整数。

因此本题使用扩展欧几里得即可。

注意:本题会爆 l o n g l o n g longlong longlong,所以我直接用了 p y t h o n python python

代码

def exgcd(a,b):
    if b == 0:
        return a,1,0
    x1 = 0
    y1 = 0
    gcd = 0
    gcd,x1,y1 = exgcd(b,a % b)
    return gcd, y1, x1 - a // b * y1


n, p, w, d = map(int, input().split())

opgcd,x,y = exgcd(w, d)

if p % opgcd != 0:
    print(-1)
    exit(0)

p //= opgcd
w //= opgcd
d //= opgcd
x *= p
y *= p
miny = (y % w + w) % w
tx = x - (miny - y) // w * d

if tx >= 0 and miny >= 0 and tx + miny <= n:
    print(f"{tx} {miny} {n - tx - miny}")
else:
    print(-1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值