扩展欧几里得总结

昨天做了一道题,发现我对扩展欧几里得理解的还不够透彻。

下面来说说扩展欧几里得。

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&&b>0; 那么由欧几里的求最大公约数可以知道gcd(a,b)=gcd(b,a%b);

那么我们可以写得方程a‘x+b‘y’=gcd(a‘,b‘);这里我们设a=b;b=a%b;那么这两个方程是等价的可以写成

ax+by=a‘x‘+b‘y‘;那么a%b=a-b×(a/b);那么ax+by=bx‘+(a-b×(a/b))×y‘;那么合并一下ax+by=ay‘+b(x‘-(a/b)y‘);

那么可以得到x=y’,y=x‘-(a/b)y‘;最后我们可以的到a×1+b×0=a=gcd(a,b);我习惯于先求a/(gcd(a,b))x+b/(gcd(a,b))=1的解;

然后ax+by=-C×(a/(gcd(a,b))x+b/(gcd(a,b)));然后的x=-C/gcd(a,b)x;y=-C/gcd(a,b)*y;最后通解为x+t×/gcd(a,b);y-t*gcd(a,b);

 1 LL  gcd(LL n,LL m)
 2 {
 3         if(m==0)
 4         {
 5                 return n;
 6         }
 7         else if(n%m==0)
 8         {
 9                 return m;
10         }
11         else return gcd(m,n%m);
12 }
13 pair<LL,LL>P(LL n,LL m)
14 {
15         if(m==0)
16         {
17                 pair<LL,LL>ask=make_pair(1,0);
18                 return ask;
19         }
20         else
21         {
22                 pair<LL,LL>an=P(m,n%m);
23                 LL x=an.second;
24                 LL y=an.first;
25                 y-=(n/m)*x;
26                 an.first=x;
27                 an.second=y;
28                 return an;
29         }
30 }

假如A*B>0;1.(a<0)那么方程可以变为abs(A)x+abs(B)y=C;然后用扩展欧几里得求解即可;

那么这样假设我们要求解在某个范围内的x,和某个范围内的y,这样的解有多少组时,那么我们先求出特解,然后二分t的值,同时二分y中t的值,这样求两个t的重合处就为组数。

假如A*B<0,如果A<0的时候我们改变方程得abs(A)x+abs(B)y=C;我们先解得特解x1,y1;而原方程为abs(A)x-By=C;-By=B(y1)那么特解y=-y1;这时abs(A)(x1+B*t)-B(-y1+abs(A)t);那么这时和上面一样二分找t就行。

假如A*B<0,如果A>0;那么abs(A)x+abs(B)y=-C;解得特解x1,y1;原方程为abs(A)x-abs(B)y=-C;那么特解y=-y1;这时abs(A)(x1+B*t)-abs(B)(-y1+abs(A)t);

下面给个很好的题的连接http://www.cnblogs.com/zzuli2sjy/p/5583123.html

时间: 2024-11-11 21:50:56

扩展欧几里得总结的相关文章

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b

【扩展欧几里得】BZOJ1477-青蛙的约会

一直在WA,后来我发现我把东西看反了-- [题目大意] 给出一个长度为L的环状坐标轴,两个点开始时位于(X,0).(Y,0).每次两点分别往右边移动m和n,问能否相遇? [思路] 由题意,可得: X+mt=Y+nt(mod L) (X+mt)-(Y+nt)=L*k (n-m)t+L*k=X-Y. 可以用扩展欧几里得来做.具体来说,显然要满足n-m和L的最大公约数(记为d)要整除X-Y,否则无解.这个可以在扩展欧几里得中求出. 式子可以化简为:[(n-m)/d]*t+(L/d)*k=(X-Y)/d

POJ 1061 青蛙的约会 扩展欧几里得

扩展欧几里得模板套一下就A了,不过要注意刚好整除的时候,代码中有注释 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ll exgcd(ll a, ll b, ll&x, ll&y) { if (b ==

POJ 2115 (模线性方程 -&gt; 扩展欧几里得)

题意: for(i=A ; i!=B ;i +=C)循环语句,问在k位操作系统中循环结束次数. 若在有则输出循环次数. 否则输出死循环. 存在这样的情况:i= 65533 :i<=2:i+= 4:时i = 2: 由模线性方程->扩展欧几里得 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using

POJ 2115 C Looooops(扩展欧几里得应用)

题目地址:POJ 2115 水题..公式很好推.最直接的公式就是a+n*c==b+m*2^k.然后可以变形为模线性方程的样子,就是 n*c+m*2^k==b-a.即求n*c==(b-a)mod(2^k)的最小解.(真搞不懂为什么训练的时候好多人把青蛙的约会都给做出来了,这题却一直做不出来.....这两道不都是推公式然后变形吗.....) 代码如下: #include <iostream> #include <cstdio> #include <string> #incl

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人

HDU1576(扩展欧几里得)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4252    Accepted Submission(s): 3277 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T

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

1.gcd: int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } 2.中国剩余定理: 题目:学生A依次给n个整数a[],学生B相应给n个正整数m[]且两两互素,老师提出问题:有一正整数ans,对于每一对数,都有:(ans-a[i])mod m[i]=0.求此数最小为多少. 输入样例: 1 10 2 3 1 2 3 2 3 5 8 1 2 3 4 5 6 7 8 97 89 67 61 59 53 47 88 12 1 2 3 4 5 6 7 8 9

【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)

poj1061--青蛙的约会--扩展欧几里得

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