牛客练习赛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
当然我也是莽过去的
创作不易,(你懂的)
全部评论
哥哥,同样的方法。python过不去。。。哭聊。
点赞 回复 分享
发布于 2020-03-28 00:28

相关推荐

09-27 10:54
重庆大学 C++
人已微死:致敬传奇耐测王。
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
7 收藏 评论
分享
牛客网
牛客企业服务