Skip to content

Commit

Permalink
Update Extended Euclidean Algorithm (Extensive).cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
Ashishgup1 authored May 26, 2020
1 parent ccba424 commit c292bac
Showing 1 changed file with 39 additions and 31 deletions.
70 changes: 39 additions & 31 deletions Extended Euclidean Algorithm (Extensive).cpp
Original file line number Diff line number Diff line change
@@ -1,84 +1,92 @@
int xgcd(int a, int b, int &x, int &y) //Returns GCD of A, B
{
if(a==0)
if(a == 0)
{
x=0;
y=1;
x = 0;
y = 1;
return b;
}
int x1, y1;
int d = xgcd(b % a, a, x1, y1);
x = y1 - (b/a)*x1;
x = y1 - (b / a) * x1;
y = x1;
return d;
}

int modular_inverse(int a, int m)
{
int x, y;
int g=xgcd(a, m, x, y);
if(g!=1)
int g = xgcd(a, m, x, y);
if(g != 1)
return -1;
else
{
x=(x%m + m)%m;
x = (x % m + m) % m;
return x;
}
}

void shift_solution(int &x, int &y, int a, int b, int cnt)
{
x+=cnt*b;
y-=cnt*a;
x += cnt * b;
y -= cnt * b;
}

bool find_any_solution(int a, int b, int c, int &x0, int &y0)
bool find_any_solution(int a, int b, int c, int &x0, int &y0, int &g)
{
int g=xgcd(abs(a), abs(b), x0, y0);
if(c%g!=0)
g = xgcd(abs(a), abs(b), x0, y0);
if(c % g != 0)
return false;
x0 *= c/g;
y0 *= c/g;
if(a<0)
x0*=-1;
if(b<0)
y0*=-1;
if(a < 0)
x0 *= -1;
if(b < 0)
y0 *= -1;
return true;
}


pair<int, int> p; //Stores one particular answer in [minx, maxx] and [miny, maxy]

int find_all_solutions(int a, int b, int c, int minx, int maxx, int miny, int maxy) //Returns number of solutions with x∈[minx, maxx], y∈[miny, maxy]
{
int x, y, g;
if(!find_any_solution(a, b, c, x, y, g))
return 0;
a /= g;
b /= g;

int sign_a = a>0 ? +1 : -1;
int sign_b = b>0 ? +1 : -1;

c /= g;

int sign_a = a > 0 ? +1 : -1;
int sign_b = b > 0 ? +1 : -1;

shift_solution(x, y, a, b, (minx - x) / b);
if (x < minx) shift_solution(x, y, a, b, sign_b);
if (x > maxx) return 0;
int lx1 = x;

shift_solution(x, y, a, b, (maxx - x) / b);
if (x > maxx) shift_solution(x, y, a, b, -sign_b);
int rx1 = x;

shift_solution(x, y, a, b, - (miny - y) / a);
if (y < miny) shift_solution(x, y, a, b, -sign_a);
if (y > maxy) return 0;
int lx2 = x;

shift_solution(x, y, a, b, - (maxy - y) / a);
if (y > maxy) shift_solution(x, y, a, b, sign_a);
int rx2 = x;

if (lx2 > rx2)
swap (lx2, rx2);
int lx = max (lx1, lx2);
int rx = min (rx1, rx2);

int lx = max(lx1, lx2);
int rx = min(rx1, rx2);

p = {lx, ((c - a * lx) / b)};

return (rx - lx) / abs(b) + 1;
}

//Problem 1: https://codeforces.com/problemset/problem/1089/F

0 comments on commit c292bac

Please sign in to comment.