exgcd
扩展欧几里得算法
扩展欧几里得算法
证明过程
P5656 【模板】二元一次不定方程 (exgcd)
#include<bits/stdc++.h>
#define int long long
#define il inline
#define ri register int
#define ru register unsigned int
#define debug printf("Now is %d\n",__LINE__);
#define random(a,b) ((a)+rand()%((b)-(a)+1))
using namespace std;
il int read()
{
int as=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') as=(as<<3)+(as<<1)+(ch^48),ch=getchar();
return as*f;
}
il void wt(int x)
{
if(!x) return;
wt(x/10),putchar(x%10+'0');
}
il int exgcd(int a,int b,int &x,int &y)
{
if(b==0) return x=1,y=0,a;
int g=exgcd(b,a%b,y,x);y-=a/b*x;
return g;
}
signed main()
{
int T=read();
for(ru o=1;o<=T;++o)
{
int a,b,c,x,y,x1_,y1_,gcd,dx,dy,sl,sr;
a=read(),b=read(),c=read(),gcd=exgcd(a,b,x,y);
if(c%gcd!=0) {printf("-1\n");continue;}//无整数解
dx=b/gcd,dy=a/gcd,x1_=x*c/gcd,y1_=y*c/gcd;
sl=ceil((-x1_+1)*1.0/(dx*1.0)),sr=floor((y1_-1)*1.0/(dy*1.0));
//有整数解但无正整数解
if(sl>sr){wt(x1_+sl*dx),putchar(' '),wt(y1_-sr*dy),putchar('\n');}
else //有正整数解
{
wt(sr-sl+1),putchar(' '),
wt(x1_+sl*dx),putchar(' '),wt(y1_-sr*dy),putchar(' '),
wt(x1_+sr*dx),putchar(' '),wt(y1_-sl*dy),putchar('\n');
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】