首页 > 其他分享 >扩展欧几里得 解二元一次方程组

扩展欧几里得 解二元一次方程组

时间:2024-04-15 21:00:14浏览次数:16  
标签:tmp return 二元 方程组 int 欧几里得 exgcd

扩展欧几里得: 最大公约数 - OI Wiki (oi-wiki.org) 

int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    int tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return d;
}

P5656 【模板】二元一次不定方程 (exgcd) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int a,b,x,y;
int exgcd(int a,int b,int &x,int &y){
    if(!b){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    int tmp=x;
    x=y;
    y=tmp-(a/b)*y;
    return d;
}
void solve(){
    int a,b,c; cin>>a>>b>>c;
    int d=exgcd(a,b,x,y);
    if(c%d) return cout<<-1<<'\n',void();
    x=x*c/d,y=y*c/d;
    int p=b/d,q=a/d,k;
    if(x<0) k=ceil((1.0-x)/p),x+=p*k,y-=q*k;
    else k=(x-1)/p,x-=p*k,y+=q*k;
    if(y>0)
        cout<<(y-1)/q+1<<' '<<x<<' '<<(y-1)%q+1<<' '<<x+(y-1)/q*p<<' '<<y<<'\n';
    else 
        cout<<x<<' '<<y+q*(int)ceil((1.0-y)/q)<<'\n';
}
signed main(){
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);int t;cin>>t;while(t--)solve();
}

 

标签:tmp,return,二元,方程组,int,欧几里得,exgcd
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18136898

相关文章

  • 欧几里得算法求解GCD
    GCD(最大公约数)欧几里得算法(辗转相除法)原理if(a%b==0)GCD=belseGCD=b%(a%b)基本情况:如果其中一个数为0,则另一个非零数一定就是两数的GC......
  • 拓展欧几里得算法——C.一日之计在于晨
    广州大学第十八届ACM大学生程序设计竞赛(同步赛)C题谈到拓展欧几里得算法,就要从欧几里得算法和裴蜀定理说起。欧几里得算法(辗转相除法)\(gcd(a,b)=gcd(b,a\modb)\)其中,当\(a=0\)时,\(\gcd(a,b)=\gcd(0,b)=b\);\(b=0\)同理证明:\(gcd(a,b)=gcd(b,a-b)\)令\(a=b+c\),\(\gcd(a,b)......
  • Leetcode 【930. 和相同的二元子数组】【统计「优美子数组」】【974. 和可被 K 整除的
    这道题目是经典的求子数组之和=goal的个数,用map维护。但是笔者在实现的过程中发现0的情况不是很好出来,问题在于mp[sum]和sum+=num的代码语句存在位置问题。后来看了下代码还是自己没有考虑清楚。这种类型的题目就是要想清楚你的做法,以及边界条件。classSolution{public:......
  • 欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理
     数据结构、算法总述:数据结构/算法C/C++-CSDN博客欧拉函数欧拉函数(Euler'stotientfunction)是一个与正整数n相关的数论函数,通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数intphi(intx){intres=x;for(inti=2;i<=x/i;i++)......
  • 欧几里得算法(证明)
    /*"简单的东西,往往包含深刻的道理"回头一看,发现简单的算法,证明却不是很简单前置知识a|b代表a可以整除bd|a&&d|b=>d|(xa+yb)证明d|a=>id=a,d|b=>jd=b,xa+yb==ixd+jyd==(ix+jy)d,(ix+jy)是整数<==>d|(xa......
  • 扩展欧几里得(exgcd)通解及其证明
    exgcd求ax+by=gcd(a,b)中x和y的通解(下面简称通解)什么是通解我们知道二元一次方程,是如果只有一个式子,那么解会有无数个而通解就是指让我们只找到一个解就可以推出其他所有解的式子(注意本证明极其复杂,请直接背模版或感性理解)知道了定义下面就是推式子了首先......
  • 政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络
    政安晨的个人主页:政安晨欢迎 ......
  • P5656 【模版】二元一次不定方程(exgcd)
    综合考查exgcd功力的题目。没有整数解当且仅当\(\gcd(a,b)\nmidc\),直接输出-1。用exgcd解方程\(ax+by=\gcd(a,b)\)得到一组特解\(x_0,y_0\)。对原方程变形得到\(a\cdot\dfrac{xc}{\gcd(a,b)}+b\cdot\dfrac{yc}{\gcd(a,b)}=c\),于是有\(ax+by=c\)的一组特解\(x_1=\d......
  • 类欧几里得
    题目主要分析这道题目的做法,大致也就是类欧的用处。设\(f(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor,g(a,b,c,n)=\sum_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor^2,h(a,b,c,n)=\sum_{i=0}^ni\lfloor\frac{ai+b}{c}\rfloor\)。首先考虑\(f\)的转移:设\(m=\l......
  • 拓展欧几里得算法
    一、拓展欧几里得算法1.1算法简析根据裴蜀定理,对任意\(a\)和\(b\),一定存在\(x\)和\(y\),使\(ax+by=\text{gcd}(a,b)\)。拓展欧几里得算法不仅能求出\(a\)和\(b\)的最大公约数,而且能找到一对\((x,y)\)使该方程成立。设求解\(ax+by=\text{gcd}(a,b)\)......