Submission #18557

#TimeUsernameProblemLanguageResultExecution timeMemory
18557imsifileMin-cost GCD (GA9_mcg)C++98
57 / 100
428 ms1084 KiB
#include<stdio.h>
#include<memory.h>

typedef long long lld;

lld a, b, p, q, dy[70][2], chk[70][2];

lld gcd(int ix, lld a, lld b){
	if(!a || !b)return 0;
	if(a<b){
		if(chk[ix][0])return dy[ix][0];
		chk[ix][0]=1, dy[ix][0]=gcd(ix+1,a,b%a)+2*p;
		if(b/a <= (2*p)/q)dy[ix][0]=gcd(ix+1,a,b%a)+(b/a)*q;
		return dy[ix][0];
	}
	else{
		if(chk[ix][1])return dy[ix][1];
		chk[ix][1]=1, dy[ix][1]=gcd(ix+1,b,a%b)+p;
		lld tmp=dy[ix][1]-gcd(ix+1,a%b,b);
		if(a/b <= tmp/q)dy[ix][1]-=tmp-(a/b)*q;
		return dy[ix][1];
	}
	return 0;
}

int main(){
	int t;
	for(scanf("%d",&t);t--;){
		scanf("%lld%lld%lld%lld", &a, &b, &p, &q);
		memset(chk,0,sizeof(chk));
		printf("%lld\n", gcd(0,a,b));
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...