exgcd

扩展欧几里得算法

扩展欧几里得算法(Extended  Euclidean  algorithm,EXGCD),常用于求 ax+by=gcd(a,b) 的一组可行解。

证明过程

ax1+by1=gcd(a,b)bx2+(amodb)y2=gcd(b,amodb)gcd(a,b)=gcd(b,amodb)ax1+by1=bx2+(amodb)y2amodb=a(ab×b)ax1+by1=bx2+(a(ab×b))y2ax1+by1=ay2+bx2ab×by2=ay2+b(x2aby2)a=a,b=bx1=y2,y1=x2aby2

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;
 } 
 

  

posted @   Bertidurlah  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示