牛客练习赛60 - D

斩杀线计算大师

https://ac.nowcoder.com/acm/problem/204271

题意:

给定 a, b,c,k,求 x,y,z,使得:ax + by + cz = k,且 x >= 0,y >= 0,z >= 0

分析:

扩展欧几里得只能求二元一次方程,自然想到枚举 z 来求 x,y;看到 k 的范围有点大,如果 k = 2*p,c = 2,p 为一个大质数,肯定是跑不过的,考虑枚举 ax + by 的值,设 ax + by = k0,当 k0 = gcd(a,b)d 时 x,y 才会有解,那就有 gcd(a,b)d + cz = k,直接扩欧求出 d 即可,然后在用扩欧求解 ax + by = k0 即可,需要注意的是:cz >= 0,所以 gcd(a,b)d <= k,当 d 取最小非负整数解一定会满足这个条件,同样 x 取最小非负整数解时一定会满足 ax <= k0 吗?为了满足 ax <= k0,k0 就越大越好,也就是 d 越大越好;而扩欧求解后有通解:d' = d + tc/gcd(a,b,c),t 为整数,再结合 gcd(a,b)d <= k,就能得到 d 的最大取值了

代码:

#include <bits/stdc++.h>

#define x first
#define y second
#define pii pair<int,int>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int maxn = 2e3+23;
LL ex_gcd(LL a,LL b,LL &x,LL &y){
    if(b == 0){x = 1; y = 0; return a;}
    LL gcd = ex_gcd(b,a%b,x,y);
    LL t = x; x = y; y = t-a/b*y;
    return gcd;
}
LL solve(LL a,LL b,LL &x,LL &y,LL k){   //求解 ax+by = k 的最小非负整数 x
    LL gcd = ex_gcd(a,b,x,y);
    x = k/gcd*x; 
    LL mod = b/gcd;
    x = (x % mod + mod) % mod;
    y = (k-a*x)/b;
    return gcd;
}
int main(){
    LL a,b,c,k,x,y,z; 
    cin >> a >> b >> c >> k;
    LL g = __gcd(a,b);
    LL gcd = solve(g,c,x,y,k);
    LL d = x, mod = c/gcd;
    LL t = (k-d*g)/(mod*g);
    d += mod*t;                   //满足条件的最大的d
    z = (k-d*g)/c;
    LL k0 = d*g;
    solve(a,b,x,y,k0);
    cout << x << " " << y << " "<< z << '\n';
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务