站外题求助(玄关)
  • 板块学术版
  • 楼主MuronaQwQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/13 16:31
  • 上次更新2024/4/13 18:41:38
查看原帖
站外题求助(玄关)
397812
MuronaQwQ楼主2024/4/13 16:31

题目与 P5656 二元一次不定方程(exgcd) 大体类似

除了 a,b,ca,b,c 的范围从 1≤a,b,c≤1091\le a,b,c\le 10^9 变成了 −109≤a,b,c≤109-10^9 \le a,b,c \le 10^9。

另外:

  • 若该行对应的询问有整数解但无正整数解,包含 22 个由空格隔开的数字,依次代表整数解中,xx 的最小正整数值,yy 的最小正整数值,若没有最小正整数值,则以最大非正整数代替。

  • 否则包含 55 个由空格隔开的数字,依次代表正整数解的数量,正整数解中,xx 的最小值,yy 的最小值,xx 的最大值,yy 的最大值,若为无穷大则以输出 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≠0a>0,b<0,c\ne0 的地方出了问题

求调qwq

2024/4/13 16:31
加载中...