数学 方程的解

这里写图片描述

细节巨多的数学题。首先解出一组x最小的正整数解->ymax,同理求出ymin。就求出了解的个数。
那么我来说说巨多的细节。
1,解不出一组解来。
2,a=0||b=0时,若另一个变量最小解小于零,无解;若能解出,就有无数组。
3,a,b异号。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
#define ll long long
using namespace std;
int t;
inline void exgcd(ll a,ll b,ll c,ll &x,ll &y,ll &g)
{
    if(!b){g=a;y=0;x=c/a;}
    else {exgcd(b,a%b,c,y,x,g);y-=(a/b)*x;}
}
inline void hh()
{
    ll a,b,c,x,y,sum,g;bool aa=0,bb=0;
    scanf("%lld%lld%lld",&a,&b,&c);
    if(!a&&!b)
    {
        if(!c)printf("ZenMeZheMeDuo\n");
        else printf("0\n");
        return;
    }
    if(c<0)a=-a,b=-b,c=-c;
    if(a<0)a=-a,aa=1;
    if(b<0)b=-b,bb=1;
    exgcd(a,b,c,x,y,g);
    if(a*x+b*y!=c){printf("0\n");return;}
    if(aa)x=-x,a=-a;
    if(bb)y=-y,b=-b;
    if(a==0)
    {
        if(y<=0)printf("0\n");
        else printf("ZenMeZheMeDuo\n");
        return;
    }
    if(b==0)
    {
        if(x<=0)printf("0\n");
        else printf("ZenMeZheMeDuo\n");
        return;
    }
    if((a<0&&b>0)||(a>0&&b<0))
    {
        printf("ZenMeZheMeDuo\n");
        return;
    }
    if(a<0)a=-a,b=-b,c=-c;
    a/=g;b/=g;c/=g;x%=b;
    while(x<=0)x+=b;
    y=(c-a*x)/b;
    ll y1=y%a;
    while(y1<=0)y1+=a;
    int ans;
    if(y1>y)ans=0;
    else ans=(y-y1)/a+1;
    if(ans>65535)printf("ZenMeZheMeDuo\n");
    else printf("%d\n",ans);
}
int main()
{
    //freopen("fuction.in","r",stdin);
    //freopen("fuction.out","w",stdout);
    cin>>t;
    while(t--)hh();
}
原文地址:https://www.cnblogs.com/QTY2001/p/7632681.html