Pagini recente » Cod sursa (job #1655172) | Cod sursa (job #1316326) | Cod sursa (job #1622283) | Cod sursa (job #875346) | Cod sursa (job #665451)
Cod sursa(job #665451)
#include <iostream>
#include <fstream>
#include <cassert>
#include <algorithm>
struct pair {
long x, y;
pair(long _x, long _y) : x(_x), y(_y) {}
};
void print(pair p)
{
std::cout << "(" << p.x << ", " << p.y << ")" << std::endl;
}
void printGcd(pair p, long a, long b)
{
std::cout << "GCD is " << a * p.x + b * p.y << std::endl;
}
pair euclid(long a, long b)
{
long init_a = a, init_b = b;
assert(a >= b);
pair prev(1, 0);
pair curr(0, 1);
// print(prev);
// print(curr);
while(b != 0)
{
//print(curr);
long q = a / b;
long r = a % b;
pair old = curr;
curr.x = prev.x - q * curr.x;
curr.y = prev.y - q * curr.y;
prev = old;
a = b;
b = r;
}
// printGcd(prev, init_a, init_b);
return prev;
}
int main(int argc, char ** argv)
{
std::ifstream fin("inversmodular.in");
std::ofstream fout("inversmodular.out");
if(!fin || !fout)
return -1;
unsigned long a, n;
fin >> a >> n;
pair result = euclid(n, a);
fout << result.y;
print(result);
return 0;
}