Exgcd 60分求助
查看原帖
Exgcd 60分求助
227728
冰糖鸽子「僕は…」楼主2020/12/27 16:17

RT,比较正常的思路 错的1,2,7,8

// Problem: P5656 【模板】二元一次不定方程(exgcd)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5656
// Memory Limit: 16 MB
// Time Limit: 500 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b,c,A,B;
int Min(int a,int b)
{
	return (a<b?a:b);
}
int E(int x,int y)
{
    int sum,f;
    if(!y){A=1;B=0;return x;}
    sum=E(y,x%y);
    f=A;
    A=B;
    B=f-B*(x/y);
    //cout<<a<<' '<<b<<' '<<x<<' '<<y<<endl;
    return sum;
}
void done()
{
	int g=E(a,b),as1,as2,as3,as4,as5,pd=1,s1n,s3n;
	if(c%g){cout<<-1<<endl;return;}
	A=A*c/g;B=B*c/g;
	as1=A-(A/(b/g))*(b/g);//A_min
	s1n=(A/(b/g));
	if(A-(A/(b/g))*(b/g)<=0)
	{
		as1+=(b/g);
		s1n--;
	}
	as2=B+(s1n*a/g);//B_max
	if(as2<0)
	{
		pd=0;
	}
	as3=B-(B/(a/g))*(a/g);//B_min
	s3n=(B/(a/g));
	if(B-(B/(a/g))*(a/g)<=0)
	{
		s3n--;
		as3+=(a/g);
	}
	as4=A+(s3n*b/g);
	if(as4<0)
	{
		pd=0;
	}
	if(pd)
	{
		//正常五个
		cout<<(as2-as3)/(a/g)+((as2-as3)%(a/g)==0?1:0)<<' '<<as1<<' '<<as3<<' '<<as4<<' '<<as2<<endl;
	}
	else
	{
		//无正整数解
		cout<<as1<<' '<<as3<<endl;
	}
}
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b>>c;
		done();
	}
	return 0;
}
2020/12/27 16:17
加载中...