题目与 P5656 二元一次不定方程(exgcd) 大体类似
除了 a,b,c 的范围从 1≤a,b,c≤109 变成了 −109≤a,b,c≤109。
另外:
若该行对应的询问有整数解但无正整数解,包含 2 个由空格隔开的数字,依次代表整数解中,x 的最小正整数值,y 的最小正整数值,若没有最小正整数值,则以最大非正整数代替。
否则包含 5 个由空格隔开的数字,依次代表正整数解的数量,正整数解中,x 的最小值,y 的最小值,x 的最大值,y 的最大值,若为无穷大则以输出 INF 代替。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
int T,a,b,c;
pair<int,int> exgcd(int a,int b){
if(!b){
return {1,0};
}
pair<int,int> t=exgcd(b,a%b);
return {t.second,t.first-(a/b)*t.second};
}
signed main(){
freopen("exgcd3.in","r",stdin);
freopen("exgcd3.ans","w",stdout);
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld",&a,&b,&c);
if(a==0 && b==0 && c==0){
printf("INF 1 1 INF INF\n");
continue;
}
if(c!=0){
if(a==0 && b==0){
printf("-1\n");
continue;
}
if(a==0){
if(c%b!=0){
printf("-1\n");
continue;
}
printf("INF 1 %lld INF %lld\n",c/b,c/b);
continue;
}
if(b==0){
if(c%a!=0){
printf("-1\n");
continue;
}
printf("INF %lld 1 %lld INF\n",c/a,c/a);
continue;
}
}
if(c==0){
if(a==0){
printf("1 0\n");
continue;
}
if(b==0){
printf("0 1\n");
continue;
}
// ax=by
// a/b=x/y
b=-b;
int abGCD=__gcd(a,b);
if(abGCD<0) abGCD*=-1;
a/=abGCD;
b/=abGCD;
if(b<0){
printf("%lld %lld\n",a,-b);
continue;
}
else{
printf("INF %lld %lld INF INF\n",a,b);
continue;
}
}
if((a<0 && b<0) || (a<0 && b>0)) a=-a,b=-b,c=-c;
int abGCD=__gcd(a,b),kf;
if(c%abGCD!=0){
printf("-1\n");
continue;
}
pair<int,int> xy=exgcd(a,b);
int x_0=xy.first;
int y_0=xy.second;
int x_1=x_0*(c/abGCD);
int y_1=y_0*(c/abGCD);
int dx=b/abGCD;
int dy=a/abGCD;
int xSmall,yBig;
if(a>0 && b<0){
if(x_1<=0){
kf=ceil((1.0-x_1)/1.0/dx);
x_1=x_1+kf*dx;
y_1=y_1-kf*dy;
}
if(y_1<=0){
kf=ceil((y_1-1.0)/1.0/dy);
x_1=x_1+kf*dx;
y_1=y_1-kf*dy;
}
// kf=max(ceil((1.0-x_1)/1.0/dx),ceil((1.0-y_1)/1.0/dy));
printf("INF %lld %lld INF INF\n",x_1,y_1);
continue;
}
// x=x_1+k*dx; y=y_1-k*dy;
if(x_1<0){
kf=ceil((1.0-x_1)/1.0/dx);
xSmall=x_1+kf*dx;
yBig=y_1-kf*dy;
}
else{
kf=(x_1-1)/dx;
xSmall=x_1-kf*dx;
yBig=y_1+kf*dy;
}
if(yBig<=0){
printf("%lld ",xSmall);
// ysmall
printf("%lld\n",yBig+dy*(int)ceil((1.0-yBig*1.0)/1.0/dy));
}
else{ // num xsmall ysmall xbig ybig
printf("%lld %lld %lld %lld %lld\n",(yBig-1)/dy+1,xSmall,(yBig-1)%dy+1,xSmall+dx*((yBig-((yBig-1)%dy+1))/dy),yBig);
}
}
}
应该是 a>0,b<0,c=0 的地方出了问题
求调qwq