exgcd扩展欧几里得求解的个数

知识储备

扩展欧几里得定理

欧几里得定理

(未掌握的话请移步[扩展欧几里得])

正题

设存在ax+by=gcd(a,b),求x,y。
我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0;

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

到b==0时,我们可以得到一组解:(1,0)。
接下来再逐步回带,求出所有可能的解。具体是为什么呢?

证明

已知:

ax1+by1=gcd(a,b)
bx2+(a mod b)y2=gcd(a,b)
a mod b = a-a/b*b

可求得:
ax1+by1=bx2+(a mod b)y2=gcd(a,b)

ax1+by1=bx2+(a-a/b*b)y2=gcd(a,b)
化简得
ax1+by1=bx2+ay2-a/b*b*y2=gcd(a,b)
所以可证出:
对于每一次递归中的x1y1,与上一次递归中的x2y2存在如下关系:
x1 = y2,y1 = x2 - a / b * y2

证明毕,
每次的x和y均存在递归关系,所以我们可以在求得一组解后回溯时回带求出其他解,此时计数

P.S.

对于求方程正整数解的个数的题,需要注意特判
设ax+by=c,给定a,b,c,求x,y的正整数解个数

x=0,y=0,z=0时,方程无数解
x=0,y=0,z!=0时,方程无解
x,y<0,z>0时方程无解,反之亦然

原文地址:https://www.cnblogs.com/floatiy/p/9457844.html

时间: 2024-11-11 13:53:50

exgcd扩展欧几里得求解的个数的相关文章

UESTC 288 青蛙的约会 (扩展欧几里得求解方程)

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

青蛙的约会(exgcd/扩展欧几里得)

题目描述 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这两只青蛙分别叫

【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. --信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳到一格才行,所以说 \(x+mt=y+nt(mod l) \) \((x-y)+(m-n)t=0(mod l)\) \((m-n)t+ls=(y-x)  s属于整数集\) 令a=n-m,b=l,c=gcd(a,b),d=x-y 则有\( at+bs=d\) 扩展欧几里得求解. 设c=gcd(a,b)

【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions

题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < a1, a2 ≤ 2·109,  - 2·109 ≤ b1, b2, L, R ≤ 2·109, L ≤ R). 题目思路: [数论][扩展欧几里得] 据题意可得同余方程组 x=b1(mod a1) 即 x=k1*a1+b1 x=b2(mod a2) x=k2*a2+b2 化简,k1*a1=k2*a2

扩展欧几里得定理总结

拓展欧几里得定理主要用来求解同余线性方程,求逆元等,遇到题目给出形如ax+by==c,要求一组满足要求的x和y时,可以联系扩展欧几里得求解 拓展欧几里得由 gcd(a,b) = gcd(b,a%b) 推出 由于 a*x + b*y == gcd(a,b) 必定有解 所以 b*x + (a%b)*y == gcd(b,a%b) 最终得到ax+by==a*y1+b*(x1-(a/b)*y1) 当x0 y0 是方程的一组解,可以得到所有解的形式满足 x=x0+b/d*t y=y0-a/d*t 当 题目

扩展欧几里得总结

昨天做了一道题,发现我对扩展欧几里得理解的还不够透彻. 下面来说说扩展欧几里得. Ax+By+C=0:那么我们求解这个方程,我们可以将C移到方程右边那Ax+By=-C; 然后我们先分析下A,B的符号,那么如果A=0,那么By=-C;直接求解,如果B能够整除C的话,那么Y=-C/B;那么x可以取任意整数值,同理当B=0时,那么当A=B=0时,C=0,那么x,y取任意的值,当C不为0则无解. 下面来说下扩展欧几里得 的算法原理: 我们求解 ax+by=gcd(a,b);这里我们假定a>0&&am

扩展欧几里得及中国剩余定理

Exgcd 扩展欧几里得 void exgcd(int a,int b,int &x,int &y){ if(!b){x=1,y=0;return;} exgcd(b,a%b,x,y);b-=y*(a/b); } 对于 \(gcd(a,b)=g\) ,\(a\times k_1+b\times k_2 =g\) 通过 \(exgcd(a,b,x,y)\) \(k_1=x+k\times b\) 对于 \(gcd(a,b)=g\) ,\(a\times k_1+b\times k_2=C\t

URAL 1204. Idempotents (扩展欧几里得)

题目链接 题意 : 给你一个同余方程, x*x ≡ x  (mod n),让你求出所有的小于n的x. 思路 : 先来看同余的概念 :给定一个正整数m,如果两个整数a和b满足a-b能被m整除,即m|(a-b),那么就称整数a与b对模m同余,记作a≡b(mod m).对模m同余是整数的一个等价关系. 因此题目中给定的式子可以写成:(x*x-x)/n=k.也就是说(x*x-x)是n的整数倍,取余n是0. 因为n=p*q,而且gcd(p,q)=1 ;所以上式可以写为,x*(x-1)/(p*q)=k. 让

扩展欧几里得与二元不定方程

二元不定方程,就是形同ax+by=c的二元方程, 只不过有无数组解罢了. 还有原谅我蒟蒻,不会用字母的写法,只好直觉+小学数学写法了 我们可以使用辗转相除法来解决(过渡好生硬啊) 我们首先来看一组例子 为了方便理解,特将每个多项式系数都写了出来,同时并没有将符号带进括号 37x-107y=25 37x-(37*2+33)y=25 37(x-2y)-33y=25 (-33*-1+4)(x-2y)-33y=25 -33(-x+3y)+4(x-2y)=25 (4*-8-1)(-x+3y)+4(x-2y