扩展欧几里得【数论
2014-08-18 12:34
211 查看
m和n不全为零
一定存在gcd(m,n)==xm+ny
模板1
6*0 + 2*1 = 2
[Finished in 0.0s]
模板2
x y为全局变量,不需要初始化
ax+by==gcd(a,b)
对于解一般不定式 ax+by==c 是上式的整数倍
即仅当c%gcd(a,b)为0时 有整数解 x,y
x=x0*c/gcd(a,b);
y=y0*c/gcd(a,b);
题目经常求最小的正x值 有一个神奇的公式
x=x+b/gcd(a,b)*k
y=y-a/gcd(a,b)*k (k为任意整数)
即对每组x,y值都有ax+by==c成立
所以求得x后,
令s=b/gcd(a,b);
x=x(x%s+s)%s;
x为最小正值
一定存在gcd(m,n)==xm+ny
模板1
int exgcd(int m,int n,int &x,int &y)//返回gcd(m,n) { int x1,y1,x0,y0; x0=1; y0=0; x1=0; y1=1; x=0; y=1; int r=(m%n+n)%n; int q=(m-r)/n; x=0,y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x; y1=y; m=n; n=r; r=m%n; q=(m-r)/n; } return n; } int main() { int x,y; int m=6 ; int n= 2; int a =exgcd(6,2,x,y); printf("6*%d + 2*%d = %d \n",x,y,a ); return 0; }
6*0 + 2*1 = 2
[Finished in 0.0s]
模板2
x y为全局变量,不需要初始化
ll exgcd(ll a, ll b) { if(b==0){ x=1,y=0; return a; } ll d=exgcd(b,a%b); ll t=x; x=y; y=t-(a/b)*y; return d; }
ax+by==gcd(a,b)
对于解一般不定式 ax+by==c 是上式的整数倍
即仅当c%gcd(a,b)为0时 有整数解 x,y
x=x0*c/gcd(a,b);
y=y0*c/gcd(a,b);
题目经常求最小的正x值 有一个神奇的公式
x=x+b/gcd(a,b)*k
y=y-a/gcd(a,b)*k (k为任意整数)
即对每组x,y值都有ax+by==c成立
所以求得x后,
令s=b/gcd(a,b);
x=x(x%s+s)%s;
x为最小正值
相关文章推荐
- 欧几里得和扩展欧几里得讲解(基础数论)
- poj 1061 青蛙的约会 数论 扩展欧几里得 commemorate the feelings of me
- 基本数论入门(快速幂+扩展欧几里得)
- 数论 —— 逆元(费马小定理/扩展欧几里得)
- POJ 1091 跳蚤 数论-容斥原理、扩展欧几里得
- 总结——数论:欧几里得算法&扩展欧几里得
- 数论 + 扩展欧几里得 - SGU 106. The equation
- hiho 1297 数论四·扩展欧几里得
- poj1061 青蛙的约会 (数论,扩展欧几里得)
- hdu 1576(数论之扩展欧几里得)
- POJ 青蛙的约会 1061【经典数论-扩展欧几里得】
- (数论)整数二元一次不定方程(扩展欧几里得求解)
- ACM: 一题数论题(扩展欧几里得定理…
- ACM 数论 青蛙的约会 扩展欧几里得
- poj 2142 数论 扩展欧几里得
- poj 2142 The Balance 数论-扩展欧几里得
- POJ 1091 跳蚤 数论-容斥原理、扩展欧几里得
- [NWPU][2014][TRN][21]数论入门 B - 扩展欧几里得 POJ 1061
- 数论 + 扩展欧几里得 - SGU 106. The equation