exgcd求助
查看原帖
exgcd求助
241102
ThisIsAName楼主2020/10/14 07:56

exgcd板子题,那就谢谢巨佬萌帮蒟蒻debug吧

//60分代码 
#include<cstdio>
#include<iostream>
#define rg register
#define il inline
#define ENDL putchar('\n')
#define SPACE putchar(' ')
using namespace std;

template <typename T> il void Iput(T &x)
{
	char c;
	while((c=getchar())<'0' || c>'9');
	x = c^48;
	while((c=getchar())>='0' && c<='9')	x = (x<<1) + (x<<3) + (c^48);
}

template <typename T> void Wri(T x)
{
	if(x > 9)	Wri(x/10);
	putchar(x%10^48);
}

template <typename T> il void Oput(T x)
{
	if(x < 0)	putchar('-'), x=-x;
	Wri(x);
}

int T;

void exgcd(int a, int b, int &g, int &x, int &y)
{
	if(!b)
	{
		x=1; y=0; g=a; 
	}
	else
	{
		exgcd(b, a%b, g, y, x);
		y -= x*(a/b);
	}
}

int main()
{
	
	Iput(T);
	for(rg int rp=1 ; rp<=T ; ++rp)
	{
		int a, b, c, x, y, g, num, xmin, ymin, xmax, ymax;
		Iput(a), Iput(b), Iput(c);
		exgcd(a, b, g, x, y);
		if(c%g)
		{
			putchar('-'), putchar('1'), ENDL;
			continue;
		}
		/*
			c /= g;
			x *= c;
			y *= c;
			这样只有30分?? 
		*/
		x *= c/g;
		y *= c/g;
		a /= g;
		b /= g;
		xmin = (x%b+b)%b;
		ymin = (y%a+a)%a;
		if(!xmin)	xmin += b;
		if(!ymin)	ymin += a;
		a *= g;
		b *= g;
		xmax = (c-b*ymin)/a;
		ymax = (c-a*xmin)/b;
		a /= g;
		b /= g;
		num = (xmax-xmin)/b+1;
		if(xmax<=0 || ymax<=0)
		{
			Oput(xmin);
			SPACE;
			Oput(ymin);
			ENDL;
		}
		else
		{
			Oput(num);
			SPACE;
			Oput(xmin);
			SPACE;
			Oput(ymin);
			SPACE;
			Oput(xmax);
			SPACE;
			Oput(ymax);
			ENDL;
		}
	}
	
	return 0;
}
2020/10/14 07:56
加载中...