牛客练习赛60d斩杀线计算大师,exgcd
斩杀线计算大师
http://www.nowcoder.com/questionTerminal/87e4a81191134d45a9374a275d990ff1
把x遍历一遍,然后把转化为关于y,z的yb+zc=(k-xa)的二元一次方程(exgcd模板题),exgcd求解
用exgcd求出的是y0,然后转成y(放大(k-xa)/gcd倍),这里的t是y的最小增幅
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,c,x,y,z,d,s,k,ym;
int exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1, y=0;
return a;
}
int d;
d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
cin>>a>>b>>c>>k;
for(int i=0;i*a<=k;i++){
s=k-i*a;
d=__gcd(b,c);
if(s%d) continue;
d=exgcd(b,c,y,z);
y=y*s/d;//y0转y
ll t=c/d;
y=(y%t+t)%t;//y的最小正整数解
if(s%d==0&&k-i*a-b*y>=0){
cout<<i<<" "<<y<<" "<<(k-i*a-b*y)/c<<endl;;
return 0;
}
}
return 0;
} 其实比赛暴力莽就完事了,就看你比赛敢不敢交
当然也要缩小下暴力范围
额,😓这题比赛时的数据有点弱,遍历y(1~k),z然后用if(k-y*b-z*c)%a==0可以莽过去,但是遍历x,y求z或者遍历x,z求y就会tel
当然我也是莽过去的
创作不易,
(你懂的)