| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 12118 | kriii | Min-cost GCD (GA9_mcg) | C++14 | 0 ms | 0 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <algorithm>
#include <hash_map>
using namespace std;
long long a,b,p,q,l;
std::hash_map<long long, long long> chk;
long long go(long long a, long long b)
{
	if (a == 0 || b == 0) return 0;
	if (a == b) return p < q ? p : q;
	long long h = a*b+a*3+b;
	long long &r = chk[h];
	if (r) return r;
	r = p + go(b,a%b);
	if (a > b){
		long long d = a / b, e = q * d;
		if (d <= l) r = min(r, e+go(a-b*d,b));
	}
	else{
		long long d = b / a, e = q * d;
		if (d <= l) r = min(r, e+go(a,b-a*d));
	}
	return r;
}
int main()
{
	int T; scanf ("%d",&T); while (T--){
		scanf ("%lld %lld %lld %lld",&a,&b,&p,&q);
		chk.clear(); l = 1e18 / q;
		printf ("%lld\n",go(a,b));
	}
	return 0;
}
