随笔 - 26  文章 - 0  评论 - 0  阅读 - 2567 

P5656 【模板】二元一次不定方程 (exgcd)

ax+by=dax1+by1=cx1=xcgcd(a,b),y1=ycgcd(a,b):x1+λbgcd(a,b)>0y1λagcd(a,b)>0:x1+1bgcd(a,b)λy11agcd(a,b)

//正整数解:x>0,y>0
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9')x=(x<<3)+(x<<1)+ch-48,ch=getchar();
	return x*f;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(b==0){
		x=1,y=0;
		return a;
	}
	ll d=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}
int main(){
	int T;
	ll a,b,c,d,x,y,tmp,l,r,X,Y;
	T=read();
	while(T--){
		a=read(),b=read(),c=read();
		d=exgcd(a,b,x,y);
		if(c%d!=0){
			puts("-1");
			continue;
		}
		tmp=c/d;
		x*=tmp,y*=tmp;
//		printf("x=%d y=%d\n",x,y);
		l=ceil((double)(-x+1)/(double)(b/d));
		r=floor((double)(y-1)/(double)(a/d));
		if(l>r){
			printf("%lld %lld\n",x+l*(b/d),y-r*(a/d));
		}
		else{
			printf("%lld ",(r-l+1));
			X=x+l*(b/d);
			Y=y-r*(a/d);
			printf("%lld %lld ",X,Y);
		
			printf("%lld %lld\n",(c-b*Y)/a,(c-a*X)/b);
		}
	}
	return 0;
}
posted on   Bwzhh  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示